python - 缩小图像会增加内存消耗?
问题描述
我有一个试图在 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 质量或压缩。基本上,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 编写时,文件大小要小得多。