在OpenCV中保存图像后,图像的颜色变得暗淡。

9

我正在使用opencv模块来读取和写入图像。下面是代码,下面是我正在读取的图像,第二张图像是通过使用cv2.imwrite()保存到磁盘上的。

import cv2

img = cv2.imread('originalImage.jpg')
cv2.imwrite('test.jpg',img)

原始图像

使用opencv保存的图像

显然第二张图片颜色比较暗淡。有没有什么解决方法,或者是我遗漏了某些设置参数..?


尝试以另一种图像格式保存。 - Rick M.
@RickM. 你能建议一个格式吗?我应该尝试PNG吗? - Riken Mehta
可能是不丢失保存在cv2.imwrite()中的图片质量的重复问题。 - Shraddheya Shendre
即使使用 PNG 格式,我仍然面临着相同的质量下降问题。 - Riken Mehta
3个回答

4

我已经对@mark提出的关于ICC配置文件的问题进行了一些研究。我已经找到了在Python PIL模块中处理此问题的方法。以下是对我有效的代码。我还学会了使用PNG文件格式来进行无损转换,而不是JPEG。

import Image
img = Image.open('originalImage.jpg')
img.save('test.jpg',icc_profile=img.info.get('icc_profile'))

我希望这篇文章能够帮助其他人。

干得好 - 谢谢你与社区分享你的发现。 - Mark Setchell
谢谢 @Mark,正是因为你的发现,我才能够解决我的问题。 - Riken Mehta

3
区别在于图中左侧的初始图像带有ICC配置文件,而右侧的第二个则没有。

enter image description here

通过运行名为identifyImageMagick 工具,我获取了上面的图片:

identify -verbose first.jpg    > 1.txt
identify -verbose second.jpg   > 2.txt

然后我像这样运行了出色的opendiff工具(它是macOS的一部分):

opendiff [12].txt

你可以使用ImageMagick从第一张图片中提取ICC配置文件,方法如下:

convert first.jpg profile.icc

那么在通过OpenCV编写图像时,我该如何处理这个ICC配置文件呢? - Riken Mehta
很好的发现!然而这并没有解决原帖作者的问题! - Ander Biguri
1
嗨@AnderBiguri,是的,我同意这并不能解决问题,但我认为那些有助于理解问题的回答是完全可以接受的,如果两个人各知道一半的答案...那么我们可能能够在我们之间找到完整的答案。目前,我要说我相信OpenCV更倾向于解决“计算机视觉问题”,而较少关注打印和再现目的下的色彩管理的准确性,因此我怀疑OP将需要自行考虑ICC配置文件。我可能错了 :-) - Mark Setchell
@RikenMehta OpenCV不读取或写入ICC配置文件(或其他元数据),因此您需要在OpenCV之外寻找解决方案。 - SSteve
@SSteve,我需要制作一组图像并将其写回磁盘以供后续使用。你能推荐我在Python中可以使用的其他模块吗? - Riken Mehta
显示剩余2条评论

0

你的第一张输入图片在元数据中有一些关联的ICC配置文件,这是一个可选属性,大多数设备可能根本不会注入它。ICC配置文件基本上执行一种颜色校正,而校正系数是在校准过程中为每个唯一的设备计算的。

现代Web浏览器、图像查看工具主要在渲染图像到屏幕之前考虑这个ICC配置文件信息,这就是为什么两张图片之间存在差异的原因。

但不幸的是,OpenCV不会从图像的元数据中读取ICC配置文件以执行任何颜色校正。


你知道有没有任何语言或框架下可以处理ICC文件的工具吗? - Riken Mehta
我不确定是否有任何库支持读取带元数据的图像,但您可以查看此链接以获取使用sRGB配置文件而非ICC的图像。 - ZdaR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接