缩小图像会增加内存消耗吗?

Downscaling images increases memory consumption?

我有一个大型图像数据集,我想在 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。我不明白为什么会这样。我已经仔细检查了图像尺寸以确认它们的尺寸正在缩小。减小图像大小会增加内存消耗似乎非常违反直觉。

答案是 JPEG 质量或压缩。基本上,OpenCV 中的 imwrite() 如果您不另行说明,它会以默认的 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 时,文件大小要小得多。