我正在对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);
可能有什么问题?请帮忙。 感谢。
答案 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));
}
、RGB
和P
。
要快速检查图像的模式,您可以使用 Python:
L
基本上,当使用 from PIL import Image
print(Image.open("5.png").mode)
和 P
时,您是在归属 L
而 8 bits/pixel
使用 RGB
。
有关更详细的解释,可以参考这篇精美的 stackoverflow 帖子:What is the difference between images in 'P' and 'L' mode in PIL?
现在,当我们使用 OpenCV 打开一个 PNG 文件时,我们得到的将是一个包含三个通道的数组,无论是哪种模式
文件被保存到.数据类型为3*8 bits/pixel
的三个通道,这意味着当我们uint8
这个数组到一个文件中时,无论
你压缩它有多难,如果它以imwrite
或P
模式保存,将很难击败原始文件。
我猜@Karmar 可能已经解决了这个问题。对于未来的读者,请检查您自己的 L
模式。