首页 > 解决方案 > 缩小图像会增加内存消耗?

问题描述

我有一个试图在 Google Colab 中使用的大型图像数据集。但是,.zip 文件太大。所以,我正在缩小图像以减少内存使用量。我正在使用的代码是:

img = cv2.imread(img_path)
img = cv2.resize(img, (int(img.shape[1] * 0.75), int(img.shape[0] * 0.75)))
cv2.imwrite(img_save_path, img)

然而,在对约 100k 图像执行此操作后,原始图像似乎比缩小图像占用了近 3 Gb。我不明白为什么会这样。我已经仔细检查了图像尺寸,以确认它们的尺寸正在缩小。减小图像大小会增加内存消耗,这似乎非常违反直觉。

标签: pythonimagestorage

解决方案


答案是 JPEG 质量或压缩。基本上,imwrite()OpenCV中写入默认 JPEG 质量为 95,如果您不另外说明的话。如果您的原始图像质量较低,则使用OpenCV编写它们时文件大小会增加。

让我们更详细地看一下。使用ImageMagick创建一个质量为 75 的随机图像:

magick -size 640x480 xc: +noise random -quality 75 image.jpg

在此处输入图像描述

文件大小为176kB,我们可以用ImageMagick检查质量

identify -verbose image.jpg | grep Quality
Quality: 75

或者,也许更简单的是exiftool

exiftool -JPEGQualityEstimate image.jpg
JPEG Quality Estimate           : 75

现在将图像加载到 OpenCV 并编写 3 种不同的方式:

import cv2

# Load image
im = cv2.imread('image.jpg', cv2.IMREAD_UNCHANGED)

# Write carelessly using default parameters
cv2.imwrite('default.jpg',im)

# Write with quality 60 and 80
cv2.imwrite('Q60.jpg',im,[int(cv2.IMWRITE_JPEG_QUALITY), 60])
cv2.imwrite('Q80.jpg',im,[int(cv2.IMWRITE_JPEG_QUALITY), 80])

结果很清楚:

-rw-r--r--     1 mark  staff   347005  4 Sep 10:38 default.jpg
-rw-r--r--     1 mark  staff   138115  4 Sep 10:38 Q60.jpg
-rw-r--r--     1 mark  staff   190183  4 Sep 10:38 Q80.jpg

使用默认设置写入时,文件已从 176kB 膨胀到 347kB。当以质量 60 或 80 编写时,文件大小要小得多。


推荐阅读