¿Hay alguna forma de generar archivos TIFF monocromáticos en OpenCV con compresión de grupo 4?
Este es el comando para hacerlo con imagemagick/graphicsmagick
'gm convert '.$file.' -type bilevel -monochrome -compress group4 '.$output
OpenCV versión 4.5.1
# g++ -Wall -O3 -std=c++17 main.cpp -o main `pkg-config opencv4 --cflags --libs` -ltiff
find
no devuelve nada
root@x:/usr/include/opencv4/opencv2# find . -name "*tif*"
código
#include <tiffio.h> #include <opencv4/opencv2/opencv.hpp> std::vector<int> params = {cv::IMWRITE_TIFF_COMPRESSION, COMPRESSION_CCITTFAX4}; cv::imwrite(_output, src_bin, params);
error
[ WARN:0] global ../modules/imgcodecs/src/grfmt_tiff.cpp (914) writeLibTiff OpenCV TIFF (línea 914): TIFFSetField fallido (tif, TIFFTAG_PREDICTOR, predictor) imwrite_('out.tif'): no se puede escribir datos: OpenCV(4.5.1) ../modules/imgcodecs/src/grfmt_tiff.cpp:914: error: (-2:Error no especificado) OpenCV TIFF: falló TIFFSetField(tif, TIFFTAG_PREDICTOR, predictor) en la función 'writeLibTiff'
OpenCV usa libtiff
( enlace ). Si llama a cv.imwrite
( enlace ), puede pasar parámetros adicionales.
Para la compresión del grupo 4, los documentos dicen que debe pasar el indicador IMWRITE_TIFF_COMPRESSION
( enlace ) con el valor COMPRESSION_CCITTFAX4
( enlace ).
Ejemplo:
#include <tiffio.h> #include <opencv2/opencv.hpp> using namespace cv; using namespace std; vector<int> params = {IMWRITE_TIFF_COMPRESSION, COMPRESSION_CCITTFAX4}; bool success = imwrite("image.tif", img, params);
Bueno, así es como debería funcionar. Pero parece que opencv4 actualmente tiene uno o más problemas al escribir TIFF del Grupo 4. Por cierto, es lo mismo cuando prueba python-lib. Este problema conocido se relaciona con una etiqueta predictora que opencv agrega incorrectamente. Apliqué la solución a mi compilación local, pero después de eso, surgió un problema más que faltaba una conversión de Mat de 8 bits a 1 bit/muestra para el grupo 4. Así que mi recomendación es:
En su lugar, puede utilizar la API Magick++ de GraphicsMagick.
#include <opencv2/opencv.hpp> #include <Magick++.h> using namespace cv; using namespace Magick; int main(int argc, char* argv[]) { InitializeMagick(""); Mat img = imread("img.png"); Image image(img.cols, img.rows, "BGR", CharPixel, (char *)img.data); image.compressType(CompressionType::Group4Compression); image.write("img.tif"); return(0); }