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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在OpenCV中使用Adobe RGB色彩空间读取jpeg图像?相关的知识,希望对你有一定的参考价值。

我试图在OpenCV中读取和写入Adobe RGB色彩空间的jpegs。 OpenCV假定jpeg具有sRGB色彩空间,当显示或写入文件时,图像会失去一些颜色强度。我发现这种强度损失是由于我的previous question给出的答案的颜色空间差异。

无论如何我可以让OpenCV读取Adobe RGB色彩空间而不将其转换为sRGB吗?

答案

一些信息对希望处理ICC和其他配置文件的人来说是有用的...


您可以使用安装在大多数Linux发行版上的ImageMagick查看映像中存在的配置文件,并且可用于macOS和Windows。在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 Module将其应用于计划与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'x00x00x020ADBEx02x10x00x00mntrRGB XYZ x07xd0x00x08x00x0bx00x13x003x00;acspAPPLx00x00x00x00nonex00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00xf6xd6x00x01x00x00x00x00xd3-ADBEx00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00
cprtx00x00x00xfcx00x00x002descx00x00x010x00x00x00kwtptx00x00x01x9cx00x00x00x14bkptx00x00x01xb0x00x00x00x14rTRCx00x00x01xc4x00x00x00x0egTRCx00x00x01xd4x00x00x00x0ebTRCx00x00x01xe4x00x00x00x0erXYZx00x00x01xf4x00x00x00x14gXYZx00x00x02x08x00x00x00x14bXYZx00x00x02x1cx00x00x00x14textx00x00x00x00Copyright 2000 Adobe Systems Incorporatedx00x00x00descx00x00x00x00x00x00x00x11Adobe RGB (1998)x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00XYZ x00x00x00x00x00x00xf3Qx00x01x00x00x00x01x16xccXYZ x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00curvx00x00x00x00x00x00x00x01x023x00x00curvx00x00x00x00x00x00x00x01x023x00x00curvx00x00x00x00x00x00x00x01x023x00x00XYZ x00x00x00x00x00x00x9cx18x00x00Oxa5x00x00x04xfcXYZ x00x00x00x00x00x004x8dx00x00xa0,x00x00x0fx95XYZ x00x00x00x00x00x00&1x00x00x10/x00x00xbex9cx00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00'}

这是frog.jpg图像:

enter image description here

关键字:Python,ImageMagick,图像,图像处理,配置文件,ICC配置文件,提取,插入,应用,转换,PIL,枕头,OpenCV,CMS,pyCMS。

以上是关于如何在OpenCV中使用Adobe RGB色彩空间读取jpeg图像?的主要内容,如果未能解决你的问题,请参考以下文章

色彩空间类型---OpenCV-Python开发指南(7)

RGB色彩空间和HSV色彩空间的理解

OpenCV之色彩空间与色彩空间转换

关于单反相机的RAW和photoshop编辑srgb 和adobe rgb

OpenCV实战——OpenCV色彩空间转换

OpenCV实战——OpenCV色彩空间转换