16

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

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

在这个操作之后,我原来image的 33kB 转换成相同的 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)

这是我正在使用的图像:

在此处输入图像描述

4

4 回答 4

8

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

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

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

于 2012-08-31T13:57:15.530 回答
7

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

于 2014-05-26T09:42:28.630 回答
1

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

于 2015-08-06T04:35:47.450 回答
0

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

参考:

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

https://github.com/johnpaulada/optipng

于 2018-12-07T07:17:53.603 回答