问题描述
adobe RGB编码的图片在经过opencv, pillow等通用图片处理库时会出现颜色饱和度下降,呈现色差的问题,在使用imagemagick处理时并不会出现此现象。
问题定位
opencv, pillow等通用图片处理库默认以sRGB编码格式处理图片,在读取adobe RGB图片时会出现该类情况。
sRGB 与 Adobe RGB 区别
sRGB与Adobe RGB是两种表示颜色范围的色域标准。sRGB色域应用广泛,包括Windows、Photoshop、大部分浏览器、显示屏等的默认配置都是sRGB。而AdobeRGB能够覆盖更广泛的色域范围
sRGB色域是一个通用的标准色域,是由微软、惠普主导制定出来的标准色彩空间,意在让显示器、数位相机、扫描仪、投影仪等各种计算机外部设备与应用软件对于色彩有一个共通的语言。显示设备能够覆盖的sRGB范围越大,显示的颜色就更加丰富饱满。Adobe RGB是Adobe公司于1998年提出的实用性色彩空间,适合用来模拟印刷色,在印刷领域得到了广泛应用。
解决方案
使用 pillow 的ImageCMS 类,获取图片的icc信息,如果存在 icc_profile
, 一般情况下,该图片是以 adobe RGB编码的。此时,通过ImageCms
进行编码转换即可。
from PIL import Image, ImageCMS
import numpy as np
srgb = ImageCms.createProfile('sRGB')
def get_adobe(img):
output = BytesIO()
output.write(img.info.get('icc_profile'))
output.seek(0)
adobe = ImageCms.getOpenProfile(output)
return adobe
def convert_to_srgb(image):
if image.info.get('icc_profile', ''):
adobe = get_adobe(image)
image = ImageCms.profileToProfile(image, adobe, srgb)
return image
参考资料
https://stackoverflow.com/questions/33142786/opencv-imwrite-gives-washed-out-result-for-jpeg-images
https://stackoverflow.com/questions/33168615/how-to-read-jpeg-image-with-adobe-rgb-colorspace-in-opencv
网友评论