【问题标题】:OpenCV imwrite increases the size of png imageOpenCV imwrite 增加 png 图像的大小
【发布时间】:2012-11-22 04:23:30
【问题描述】:

我正在对 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);

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

【问题讨论】:

  • 我有同样的问题,我猜这取决于用于压缩原始图像的库和 OpenCV 使用的 png 库。
  • imread 中的 -1 是什么?为什么不直接使用 imread("5.png")?
  • 第二个参数设置为-1时,imread会读取png透明图片,否则不会返回png图片的alpha通道

标签: image-processing opencv compression png


【解决方案1】:

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

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

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

【讨论】:

  • 那么OpenCV没有解决这个问题的办法吗?
  • 您的意思是设置 CV_IMWRITE_PNG_STRATEGY_FILTERED 选项?我写compression_params.push_back(CV_IMWRITE_PNG_STRATEGY_FILTERED);压缩参数.push_back(9);但什么也没发生。
  • 我用 Z_FILTERED 尝试了 CV_IMWRITE_PNG_STRATEGY。它减小了尺寸,但很少。对于 1.20MB 图像,我得到 1.12MB
【解决方案2】:

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

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

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

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

基本上,当使用P 和L 时,您将归因于8 bits/pixel,而RGB 使用3*8 bits/pixel。 更详细的解释,可以参考这篇精彩的stackoverflow帖子:What is the difference between images in 'P' and 'L' mode in PIL?

现在,当我们使用 OpenCV 打开一个 PNG 文件时,我们得到的将是一个由三个通道组成的数组,无论是哪种模式 文件被保存到。三个通道,数据类型为uint8,也就是说当我们把imwrite这个数组放到一个文件中时,不管 压缩到什么程度,用P 或L 模式保存的话,很难打败原文件。

我猜@Karmar 可能已经解决了这个问题。以后的读者请查看自己5.png的模式。

【讨论】:

  • 这个问题是 8 年前发布的。您还使用Python Imaging Library (PIL) 而不是OpenCV。此外,这个问题和以前的答案使用OpenCV 的C++ 实现,其中PIL 显然不可用(至少不是“本机”),所以我不确定你的答案是否仍然相关。跨度>
  • 如果你仔细阅读,你会发现我花时间写的东西是有道理的。我没有使用PIL 来解决问题;我正在使用它来快速了解图像模式是什么。
  • 我对@9​​87654343@不太熟悉,但我几乎可以肯定C++中也存在用于检查图像模式的库。
  • 这是一个很好的观点。您可以在this other Q&A 中阅读有关 PNG 模式的信息。
猜你喜欢
  • 2012-08-26
  • 2017-04-22
  • 2013-11-28
  • 2019-12-01
  • 1970-01-01
  • 2013-05-29
  • 2015-11-25
  • 2020-03-17
  • 1970-01-01
相关资源
最近更新 更多