如何在OpenCV中读取使用Adobe RGB色彩空间的jpeg图像?

8
我正在尝试在OpenCV中读写带有Adobe RGB色彩空间的jpeg图像。OpenCV假定jpeg具有sRGB色彩空间,当显示或写入文件时,图像会失去一些颜色强度。通过对我的上一个问题所给出的答案,我发现这种强度损失是由于色彩空间差异造成的。
有没有办法让OpenCV读取Adobe RGB色彩空间而不将其转换为sRGB?

1
你需要自己应用转换。这里的第12页似乎解释了如何应用转换。不幸的是,我没有足够的时间来测试它。希望能有所帮助。 - Miki
@Miki 如果必要的话,我可以编写转换代码,但问题是如何知道图像是否具有Adobe RGB或sRGB颜色空间? OpenCV没有提供此类指示。cv :: imread已假定图像为sRGB。 - zindarod
图像头将包含该信息。我认为唯一的选择是从那里提取这样的信息。不过这只是猜测。如果在此期间没有其他答案,我会尽快回来测试一些东西。 - Miki
@Miki 谢谢,我很感激。 - zindarod
这只是一个概念验证(关于你的青蛙图片), 证明检查头部实际上可以起作用。 - Miki
@Miki 我曾经使用过GIMP和ImageMagick。ImageMagick的命令"identify -verbose ./treefrog.jpg"显示色彩空间是sRGB,而在GIMP中打开该图像进行显示时,则会出现一个警告,表明其色彩空间为Adobe RGB。ImageMagick无法理解AdobeRGB。 - zindarod
1个回答

4

以下是一些信息,希望对寻找解决ICC和其他配置文件问题的人有所帮助...


您可以使用安装在大多数Linux发行版上并可在macOS和Windows上使用的ImageMagick来查看图像中存在哪些配置文件。在终端或Windows上的命令提示符中运行以下命令:
magick identify -verbose frog.jpg | grep 'Profile-.*bytes'
Profile-icc: 578 bytes

这说明这张图片嵌入了一个578字节的ICC配置文件。
如果你使用Windows并且没有grep,你同样可以使用以下方法,不过你可能需要将百分号加倍,或在其前面加上插入符(^)或以某种方式进行转义:
magick identify -format "%[profiles]" frog.jpg
icc

您可以使用以下命令从图像中提取该配置文件:
magick frog.jpg frog.icc

此外,您将获得一个578字节的ICC配置文件:

ls -l *icc
-rw-r--r--   1 mark  staff       578 24 Apr 10:36 frog.icc

您可以使用file命令检查配置文件是否正确:
file *icc
frog.icc: ColorSync color profile 2.1, type ADBE, RGB/XYZ-mntr device by ADBE, 560 bytes, 11-8-2000 19:51:59 "Adobe RGB (1998)"

您可以将该配置文件应用于其他文件,如下所示:

magick other.jpg -profile "icc:frog.icc" otherWithProfile.jpg

使用上述方法提取配置文件后,您可以使用PIL/Pillow的ImageCMS模块将其应用于计划与OpenCV一起使用的图像。为此,我认为您需要使用这些步骤或非常相似的步骤,尽管我没有测试过:
from PIL import Image, ImageCMS
import numpy as np

# Open frog with PIL/Pillow
im = Image.open('frog.jpg')

iccp = PIL.ImageCms.getOpenProfile("profile.icc")
rgbp = ImageCms.createProfile("sRGB")

icc2rgb = ImageCms.buildTransformFromOpenProfiles(rgbp, iccp, "RGB", "RGB")
result = ImageCms.applyTransform(im, icc2rgb)

您可以使用以下方法将生成的图像转换为OpenCV可以处理的Numpy数组:

OpenCVim = np.array(result)

记得使用cv2.cvtColor()函数将RGB顺序转换为BGR。


与使用ImageMagick检测和提取ICC文件不同,您也可以使用PIL/Pillow来实现,如下所示:
from PIL import Image

im = Image.open('frog.jpg')

# Now look at "im.info"

{'jfif': 257,
 'jfif_version': (1, 1),
 'dpi': (72, 72),
 'jfif_unit': 1,
 'jfif_density': (72, 72),
 'icc_profile': b'\x00\x00\x020ADBE\x02\x10\x00\x00mntrRGB XYZ \x07\xd0\x00\x08\x00\x0b\x00\x13\x003\x00;acspAPPL\x00\x00\x00\x00none\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\xd6\x00\x01\x00\x00\x00\x00\xd3-ADBE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ncprt\x00\x00\x00\xfc\x00\x00\x002desc\x00\x00\x010\x00\x00\x00kwtpt\x00\x00\x01\x9c\x00\x00\x00\x14bkpt\x00\x00\x01\xb0\x00\x00\x00\x14rTRC\x00\x00\x01\xc4\x00\x00\x00\x0egTRC\x00\x00\x01\xd4\x00\x00\x00\x0ebTRC\x00\x00\x01\xe4\x00\x00\x00\x0erXYZ\x00\x00\x01\xf4\x00\x00\x00\x14gXYZ\x00\x00\x02\x08\x00\x00\x00\x14bXYZ\x00\x00\x02\x1c\x00\x00\x00\x14text\x00\x00\x00\x00Copyright 2000 Adobe Systems Incorporated\x00\x00\x00desc\x00\x00\x00\x00\x00\x00\x00\x11Adobe RGB (1998)\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00XYZ \x00\x00\x00\x00\x00\x00\xf3Q\x00\x01\x00\x00\x00\x01\x16\xccXYZ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00curv\x00\x00\x00\x00\x00\x00\x00\x01\x023\x00\x00curv\x00\x00\x00\x00\x00\x00\x00\x01\x023\x00\x00curv\x00\x00\x00\x00\x00\x00\x00\x01\x023\x00\x00XYZ \x00\x00\x00\x00\x00\x00\x9c\x18\x00\x00O\xa5\x00\x00\x04\xfcXYZ \x00\x00\x00\x00\x00\x004\x8d\x00\x00\xa0,\x00\x00\x0f\x95XYZ \x00\x00\x00\x00\x00\x00&1\x00\x00\x10/\x00\x00\xbe\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'}

这是frog.jpg图片:

enter image description here

关键词: Python, ImageMagick, 图像, 图像处理, 配色方案, ICC 配色方案, 提取, 插入, 应用, 转换, PIL, Pillow, OpenCV, CMS, pyCMS.


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