OpenCV imwrite增加了png图像的大小

时间:2012-12-04 14:02:59

标签: image-processing opencv compression png

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

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

可能有什么问题?请帮忙。 感谢。

2 个答案:

答案 0 :(得分:5)

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

更新:查看sources,似乎已添加了压缩策略设置(complaints之后),但它不是documented。我想知道这个来源是否已经发布。尝试使用Z_FILTERED设置选项CV_IMWRITE_PNG_STRATEGY,看看会发生什么

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

答案 1 :(得分:1)

@Karmar,距离您上次编辑已经很多年了。

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

PNG 文件似乎有一种叫做模式的东西。在这里,我们只关注三种模式: std::vector<uint8_t>* dataStream = new std::vector<uint8_t>(); uint8_t* dataPtr = udpPacket->getData(); for (int i = 0; i < head->m_cb; ++i) { dataStream->push_back(*(dataPtr + i)); } RGBP。 要快速检查图像的模式,您可以使用 Python:

L

基本上,当使用 from PIL import Image print(Image.open("5.png").mode) P 时,您是在归属 L8 bits/pixel 使用 RGB。 有关更详细的解释,可以参考这篇精美的 stackoverflow 帖子:What is the difference between images in 'P' and 'L' mode in PIL?

现在,当我们使用 OpenCV 打开一个 PNG 文件时,我们得到的将是一个包含三个通道的数组,无论是哪种模式 文件被保存到.数据类型为3*8 bits/pixel的三个通道,这意味着当我们uint8这个数组到一个文件中时,无论 你压缩它有多难,如果它以imwriteP模式保存,将很难击败原始文件。

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