OpenCV输出单色TIFF group 4压缩

OpenCV output monochrome TIFF group 4 compression

有没有办法在 OpenCV 中使用第 4 组压缩输出单色 TIFF 文件?

这是用 imagemagick/graphicsmagick

执行的命令
'gm convert '.$file.' -type bilevel -monochrome -compress group4 '.$output

OpenCV 版本4.5.1

更新

# g++ -Wall -O3 -std=c++17 main.cpp -o main `pkg-config opencv4 --cflags --libs` -ltiff

find 没有 return 任何东西

root@x:/usr/include/opencv4/opencv2# find . -name "*tif*"

代码

#include <tiffio.h>
#include <opencv4/opencv2/opencv.hpp>

std::vector<int> params = {cv::IMWRITE_TIFF_COMPRESSION, COMPRESSION_CCITTFAX4};
cv::imwrite(_output, src_bin, params);

错误

[ WARN:0] global ../modules/imgcodecs/src/grfmt_tiff.cpp (914) writeLibTiff OpenCV TIFF(line 914): failed TIFFSetField(tif, TIFFTAG_PREDICTOR, predictor) imwrite_('out.tif'): can't write data: OpenCV(4.5.1) ../modules/imgcodecs/src/grfmt_tiff.cpp:914: error: (-2:Unspecified error) OpenCV TIFF: failed TIFFSetField(tif, TIFFTAG_PREDICTOR, predictor) in function 'writeLibTiff'

OpenCV 使用 libtiff (link). If you call cv.imwrite (link) 你可以传递额外的参数。

对于第 4 组压缩,文档说您必须传递 IMWRITE_TIFF_COMPRESSION 标志 (link) with value COMPRESSION_CCITTFAX4 (link)。

示例:

#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);

更新

好吧,它应该是这样工作的。但是目前opencv4在编写Group 4 TIFF上似乎存在一个或多个问题。顺便说一句,当你尝试 python-lib 时也是一样的。 This known issue 处理 opencv 错误添加的预测器标签。我将此修复程序应用于我的本地构建,但之后又出现了一个问题,缺少将组 4 的 8 位 Mat 转换为 1 位/样本。所以我的建议是:

解决方法

您可以使用 GraphicsMagick API Magick++.

#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);
}