問題描述
adobe RGB編碼的圖片在經(jīng)過opencv, pillow等通用圖片處理庫時(shí)會(huì)出現(xiàn)顏色飽和度下降,呈現(xiàn)色差的問題,在使用imagemagick處理時(shí)并不會(huì)出現(xiàn)此現(xiàn)象。
問題定位
opencv, pillow等通用圖片處理庫默認(rèn)以sRGB編碼格式處理圖片,在讀取adobe RGB圖片時(shí)會(huì)出現(xiàn)該類情況。
sRGB 與 Adobe RGB 區(qū)別
sRGB與Adobe RGB是兩種表示顏色范圍的色域標(biāo)準(zhǔn)。sRGB色域應(yīng)用廣泛,包括Windows、Photoshop、大部分瀏覽器、顯示屏等的默認(rèn)配置都是sRGB。而AdobeRGB能夠覆蓋更廣泛的色域范圍
sRGB色域是一個(gè)通用的標(biāo)準(zhǔn)色域,是由微軟、惠普主導(dǎo)制定出來的標(biāo)準(zhǔn)色彩空間,意在讓顯示器、數(shù)位相機(jī)、掃描儀、投影儀等各種計(jì)算機(jī)外部設(shè)備與應(yīng)用軟件對于色彩有一個(gè)共通的語言。顯示設(shè)備能夠覆蓋的sRGB范圍越大,顯示的顏色就更加豐富飽滿。Adobe RGB是Adobe公司于1998年提出的實(shí)用性色彩空間,適合用來模擬印刷色,在印刷領(lǐng)域得到了廣泛應(yīng)用。

解決方案
使用 pillow 的ImageCMS 類,獲取圖片的icc信息,如果存在 icc_profile, 一般情況下,該圖片是以 adobe RGB編碼的。此時(shí),通過ImageCms進(jìn)行編碼轉(zhuǎn)換即可。
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