OpenCV - imread(),imwrite()增加png的大小?

Posted

技术标签:

【中文标题】OpenCV - imread(),imwrite()增加png的大小?【英文标题】:OpenCV - imread(), imwrite() increases the size of png? 【发布时间】:2012-08-26 07:55:06 【问题描述】:

我想尝试对文件进行一些简单的操作,我从打开和保存文件开始(我使用 Python)

image = cv2.imread("image.png")
cv2.imwrite("image_processed.png", image)

在此操作之后,我原来的 33kB 的 image 转换为相同的 144kB 图像。

我尝试过这样做:http://opencv.itseez.com/modules/highgui/doc/reading_and_writing_images_and_video.html?highlight=imwrite#imwrite

    params = list()
    params.append(cv.CV_IMWRITE_PNG_COMPRESSION)
    params.append(8)

    image = cv2.imread("image.png")
    cv2.imwrite("image_processed.png",image,params)

但这并没有太大变化(大小减少到 132kB)

这是我正在使用的图像:

【问题讨论】:

我在使用 png 压缩时遇到了同样的问题。切换到scikit-image 并使用它的imsave 创造了奇迹。 【参考方案1】:

您可以使用第三方命令行工具 optipng 重新压缩和缩小 png 文件大小而不会丢失任何内容。

参考:

http://optipng.sourceforge.net/pngtech/optipng.html

https://github.com/johnpaulada/optipng

【讨论】:

【参考方案2】:

半相关,但我对matplotlib.image.imsave 有同样的问题 - 它会将 8 位灰度图像保存为 16 位,这会使尺寸膨胀,即使在使用 scipy.misc.bytescale 确保它是 8 之后也是如此位数组。但是,scipy.misc.imsave 将其正确保存为 8 位图像。

【讨论】:

【参考方案3】:

正如 ypnos 所暗示的,您的源文件是 jpg(即使它具有 png 扩展名)。这就是为什么当您将其保存为 png 格式时,它将占用更多空间,因为您正在更改格式(jpg 到 png)。

尝试将最后一行替换为:

cv2.imwrite("image_processed.jpg",image,params)

而且你会看到大小没有太大变化。

或者,保持代码不变,但使用不同的图像,例如http://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png

【讨论】:

【参考方案4】:

像 GIMP 这样的一些 png 编写器编写的压缩 PNG 比 opencv 使用的标准 libpng 要好得多。您还可以使用 Imagemagick 再次打开并保存图像,看看有什么不同(与 OpenCV 相比)。

甚至还有专门的软件可以尝试更好地重新压缩 PNG,例如 pngcrush。

你能提供有问题的图片吗?关于文件大小优化,我想玩一下。

【讨论】:

我已经添加了我正在使用的图像。考虑到您的回答 - 我意识到有些程序可以让我减小 png 的大小,但我想使用 OpenCVs 的功能。 您提供了 JPEG 文件而不是原始 PNG,所以我无法真正查看压缩情况。但除此之外:您不会通过 OpenCV 获得更好的压缩。最后一件事可能是您存储 16 位图像而不是 8 位。如果您使用 CV_16U 矩阵,就会发生这种情况。

以上是关于OpenCV - imread(),imwrite()增加png的大小?的主要内容,如果未能解决你的问题,请参考以下文章

python,opencv,imread,imwrite,存储,读取图像像素不一致,这种情况是label使用jpg格式

Python-OpenCV:cv2.imread(),cv2.imshow(),cv2.imwrite()

出现错误 - 在给出 imshow、imwrite 命令 opencv 时“找不到作家”

OpenCV 例程300篇02. 图像的保存(cv2.imwrite)

OpenCV 是不是支持 .HEIC 图像格式?

opencv3 学习笔记