繁体   English   中英

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

[英]OpenCV - imread(), imwrite() increases the size of png?

我想尝试一些简单的文件操作,我开始打开并保存文件(我使用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)

这是我正在使用的图像:

在此输入图像描述

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

甚至还有专门的软件试图更好地重新压缩PNG,比如pngcrush。

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

正如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

半相关,但是我遇到了与matplotlib.image.imsave相同的问题 - 它会将8位灰度图像保存为16位,即使在使用scipy.misc.bytescale确保它是8位数组。 但是, scipy.misc.imsave将其正确保存为8位图像。

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

参考:

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

https://github.com/johnpaulada/optipng

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM