【问题标题】:OpenCV: Image size increases after compressedOpenCV:压缩后图像大小增加
【发布时间】:2019-12-01 03:40:31
【问题描述】:

我正在尝试使用 OpenCV 的 quality=90 参数比较压缩前后一堆图像的大小。但在压缩之前,我想将它们全部裁剪为固定大小。但是,我不明白为什么裁剪后的图像平均尺寸小于裁剪+压缩后的图像尺寸?

这是我正在做的事情:

import cv2
import PIL
from pathlib import Path

image_paths = [...]

cropped_imgs_size = 0
compressed_imgs_size = 0

# crop images
for orig_img_path in image_paths:
    cropped_img_path = "cropped_" + orig_img_path
    PIL.Image.open(orig_img_path).crop((0,0,256,256)).convert('RGB').save(cropped_img_path)
    cropped_imgs_size += Path(cropped_img_path).stat().st_size

    # compress cropped image
    dest_path = "q90_" + cropped_img_path
    cv2.imwrite(dest_path, cv2.imread(cropped_img_path), [int(cv2.IMWRITE_JPEG_QUALITY), 90])
    compressed_imgs_size += Path(dest_path).stat().st_size
  • 预期:compressed_imgs_size < copped_imgs_size
  • 实际:compressed_imgs_size > copped_imgs_size

我错过了什么?

【问题讨论】:

  • 你能附上一个示例输入图像和裁剪坐标吗?文件大小的实际差异是什么?
  • 我使用牛津宠物数据集作为image_paths。使用上述代码,裁剪图像的平均大小约为 14KB,压缩后的大小约为 20KB。在colab.research.google.com/drive/… 分享了其他指标

标签: python opencv python-imaging-library image-compression


【解决方案1】:

首先,您使用PIL.save() 保存作物。正如您在documentation 上看到的,默认quality=75:

save() 方法支持以下选项:

  • 质量:图像质量,范围从 1(最差)到 95(最好)。 默认值为 75。应避免高于 95 的值; 100 禁用部分 JPEG 压缩算法,并导致大文件几乎没有任何图像质量增益。

  • ...

然后,您使用 cv2.imwrite() 传递 quality=90。因此,您得到的是预期的行为。

【讨论】:

  • 谢谢贝瑞尔。所以你建议我改成PIL.Image.open(orig_img_path).crop((0,0,256,256)).convert('RGB').save(cropped_img_path, quality=90)进行裁剪?
  • PIL 和 cv2 是否也使用相同的量化表?我只是担心使用两个库是否有任何副作用。
  • @Nitin 保存作物的质量基本上是您的决定。我不知道你的要求。无论如何,我建议你只坚持一个图书馆;更少的问题,绝对。如果这回答了您的问题,请考虑标记为答案:)
  • 基本上我希望 crop 函数只裁剪而不改变质量。然后我想在后面的步骤中将它与 compress 进行比较。为了实现这一点,那么在裁剪期间设置quality=100 是否合理?
  • @Nitin 我觉得用PNG等未压缩格式保存比较合理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
  • 2017-04-22
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
  • 2013-09-03
相关资源
最近更新 更多