缩小图像会增加内存消耗吗?
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 时,文件大小要小得多。
我有一个大型图像数据集,我想在 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 时,文件大小要小得多。