5

我正在对 png 图像进行图像处理。我有以下问题。使用 imwrite() 函数保存图像后,图像的大小会增加。比如之前的图片是847KB,保存后就变成了1.20MB。这是一个代码。我只是读取图像然后保存它,但是尺寸增加了。我试图设置压缩参数,但它没有帮助。

Mat image;
image = imread("5.png", -1); 

vector<int> compression_params;
compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION);
compression_params.push_back(9);
compression_params.push_back(0);

imwrite("output.png",image,compression_params);

可能是什么问题?请提供任何帮助。谢谢。

4

2 回答 2

5

PNG 有几个影响压缩的选项:deflate 压缩级别 (0-9)、deflate 策略 (HUFFMAN/FILTERED) 以及内部预测误差过滤器的选择(或动态选择策略)(AVERAGE、PAETH...) . 似乎 OpenCV 只允许您更改第一个,并且第二个没有一个好的默认值。所以,看来你必须忍受这一点。

更新:查看来源,似乎已经添加了压缩策略设置(在投诉之后),但没有记录。我想知道该来源是否已发布。尝试使用 Z_FILTERED 设置选项 CV_IMWRITE_PNG_STRATEGY 看看会发生什么

有关参数的更多详细信息,请参阅链接的源代码。

于 2012-12-04T14:44:34.397 回答
1

@Karmar,自您上次编辑以来已经有很多年了。

我在 2021 年 6 月遇到了与您类似的困惑。我发现了某件事可能会使像我们这样的其他人受益。

PNG 文件似乎有一个叫做mode的东西。在这里,我们只关注三种模式RGBPL。要快速检查图像的模式,可以使用 Python:

from PIL import Image
print(Image.open("5.png").mode)

基本上,当 usingP并且L您归因于8 bits/pixelwhile RGBuses 3*8 bits/pixel。有关更详细的解释,可以参考这篇精美的 stackoverflow 帖子:PIL 中 'P' 和 'L' 模式中的图像有什么区别?

现在,当我们使用 OpenCV 打开一个 PNG 文件时,我们得到的将是一个包含三个通道的数组,无论该文件保存到哪种模式。数据类型的三个通道uint8,也就是说当我们把imwrite这个数组变成一个文件时,无论你怎么压缩它,如果保存在PL模式下,都很难击败原始文件。

我猜@Karmar 可能已经解决了这个问题。对于未来的读者,请检查您自己的模式5.png

于 2021-06-10T02:12:12.647 回答