OpenCV:保存图像文件 - cv.imwrite 和 f.write() 之间的区别?

问题描述 投票:0回答:1

我正在从安全摄像头导入图像进行图像处理。导入图像后,我想保存图像以进行存档(处理将即时进行)。

我看到有两种可用的方法:

  • Python 内置的文件编写器(我将其称为“文件方法”)
  • OpenCV 的 imwrite(我将其称为“OpenCV 方法”),这需要我使用 NumPy
  • 来解码图像

在使用下面的代码进行测试时,我发现了以下结果:

  • OpenCV 方法文件 (292 KB) 比文件方法的文件 (153 KB) 大得多
  • 文件之间的 dpi (96)、位深度 (24) 和像素分辨率 (1920x1080) 等值相同
  • 文件方法的文件包含更多元数据,例如创建时间、颜色表示和相机信息(参见屏幕截图),可能是由于 NumPy/OpenCV 未传递此数据。

因此,我的问题是:哪种方法更好?我想保留尽可能多的信息。为什么图像之间存在如此差异?

import requests
import numpy as np
import cv2 as cv

response = requests.get(cam_url, auth=login)
image = cv.imdecode(np.frombuffer(response.content, dtype=np.uint8), -1)

with open('file_method.jpg', 'wb') as f:
    f.write(response.content)

cv.imwrite('opencv_method.jpg', image)

注意:

  • 出于隐私原因,我无法链接快照本身。但相信我,两者之间没有明显的区别。
  • 我知道使用 PNG 文件优于 JPEG,但这不是这里的重点)。

系统信息:

  • Python 3.12.7
  • OpenCV 4.10.0
  • NumPy 2.1.3
  • WSL2(Ubuntu 22.04.5 LTS(GNU/Linux 5.15.167.4-microsoft-standard-WSL2 x86_64)
python opencv image-processing
1个回答
0
投票

如果您的目标是尽可能保留质量,则应使用

write()
方法,因为它完全保留了您从原始 Feed 中获得的质量。

使用

cv2.imwrite()
可能会降低质量,或增加不必要的膨胀,但它无法提高质量。


两者不同的原因很可能是由于 JPEG 质量设置不同。您可以通过以下方式探索原始图像与 OpenCV 保存图像的参数:

exiftool YOURIMAGE

或者,以更有针对性的方式,使用:

exiftool -filesize -JPEGQualityEstimate -n YOURIMAGE

输出将类似于此:

File Size                       : 292000
JPEG Quality Estimate           : 75
© www.soinside.com 2019 - 2024. All rights reserved.