簡體   English   中英

如何使用 scikit-image 和/或 PIL 將 ProPhoto RGB 顏色空間轉換為 RGB?

[英]How do you convert ProPhoto RGB colorspace to RGB with scikit-image and/or PIL?

我有 ProPhoto RGB 顏色空間中的 TIF 文件。 這些可以使用 scikit-image 的“imload”方法很好地導入。 但是,當我嘗試使用 matplotlib 查看圖像數據時,我收到錯誤:

plt.imshow(myImage)

plt.show()

使用 RGB 數據將輸入數據裁剪到 imshow 的有效范圍(浮點數為 [0..1] 或整數為 [0..255])。

值被裁剪為 255,並顯示全白圖像。 imread 讀取的圖像數據的錯誤是正確的。 這些值如下所示:

myImage[0]
array([[60061, 60135, 60673],
   [59907, 59983, 60533],
   [59931, 60007, 60557],
   ...,
   [60649, 60801, 61147],
   [60581, 60743, 61091],
   [60647, 60797, 61143]], dtype=uint16)

這些值顯然需要縮放以獲得介於 0-255 之間的適當 RGB 值。

當我以 IrfanView 之類的方式打開圖像文件並重新保存它時,色彩空間被正確處理為 RGB(可能是因為 IrfanView 正在為我轉換它)。 但是,我需要自動化該轉換。

是否可以使用 scikit-image 或 PIL(或其他)將使用 ProPhoto RGB 顏色空間的 TIF 轉換為 RGB 顏色空間? 我在https://scikit-image.org/docs/stable/api/skimage.color.html的 scikit-image 的“顏色”模塊的文檔中沒有看到任何提及該顏色空間。 除非“ProPhoto RGB”可以用其他名稱或與其他轉換方法兼容?

謝謝!

編輯:

用戶 Abhi25t 的回答有助於在顯示這些圖像方面取得一些進展。 但是,他們的答案似乎只針對 16 位到 8 位的轉換。 ProPhoto RGB 到 sRGB 仍然存在色彩空間問題。 希望這次編輯能更好地證明這一點。

ProPhoto 顏色空間中原始測試 TIF 圖像的像素值:

 array([[58465, 58479, 58785],
       [58575, 58591, 58879],
       [58441, 58457, 58739],
       ...,
       [58185, 58045, 58549],
       [58101, 57951, 58463],
       [57993, 57853, 58371]], dtype=uint16)

Photoshop sRGB 轉換文件的像素值:

array([[59771, 59873, 60161],
       [59863, 59965, 60235],
       [59755, 59855, 60119],
       ...,
       [59623, 59489, 59993],
       [59561, 59411, 59925],
       [59463, 59333, 59851]], dtype=uint16)

IRFAN VIEW 轉換文件的像素值(它似乎已轉換為 8 位並轉換為 sRGB 空間):

array([[233, 233, 234],
       [233, 233, 234],
       [232, 233, 234],
       ...,
       [232, 231, 233],
       [232, 231, 233],
       [231, 231, 233]], dtype=uint8)

我在這里添加了一些測試代碼和圖像: https://drive.google.com/drive/folders/1tcfUY2Kwlz-LAlt6_YXtT8l6vLnCucbM?usp=sharing

圖像應顯示為顏色檢查器目標。 只需繪制“TEST_PROPHOTO_IRFAN_SAVED.tif”的讀取結果,您就應該能夠正確看到它。

from skimage import io
import numpy as np
import matplotlib.pyplot as plt

# TEST_PROPHOTO.tif : RAW TIF FILE
# TEST_PROPHOTO_IRFAN_SAVED.tif : RAW TIF, OPENED IN IRFANVIEW AND RESAVED AS TIF
# TEST_SRGB_PHOTOSHOP_CONVERTED.tif : RAW TIF, OPENED IN PHOTOSHOP, PROFILE CONVERTED TO sRGB, RESAVED AS TIF

img_path = '/path/to/image/myImage.tif'

img_rgb = io.imread(img_path)
plt.imshow(img_rgb)
plt.show()

# VIEW IMAGE CONTENTS
img_rgb[0] # you can see these values are 16-bit;
# however, colorspace (actual RGB values) differs between the ProPhoto test file and the Photoshop converted sRGB file

# STACKOVERFLOW USER Abhi25t's METHOD TO CONVERT FROM 16-bit color [0-65535] to 8-bit color [0-255]:
img_rgb_convert = img_rgb * (255/65535)
img_rgb_convert = img_rgb_convert.astype(int)
plt.imshow(img_rgb_convert)
plt.show()

您需要執行以下步驟:

  1. 使用imread讀取圖像。
  2. 轉換為 [0-1] 范圍內的浮點表示,即轉換為浮點數並除以 65535。
  3. 使用RIMM-ROMM RGB 解碼 function 進行解碼
  4. 使用所需的顏色轉換矩陣將 RIMM-ROMM RGB 色域轉換為 sRGB 色域:
# Using CAT02.
[[ 2.0364917242 -0.7375906525 -0.2992598689]
 [-0.2257179791  1.2231765313  0.0027252248]
 [-0.0105451286 -0.1348798497  1.1452101525]]
  1. 使用sRGB 反向電光傳輸 Function 進行編碼
  2. 轉換為 [0-255] 范圍內的整數表示,即乘以 255 並轉換為 integer。

顏色可以直接使用colour.RGB_to_RGB定義做 3 到 5。 假設數據已經在浮點范圍內,轉換將是這樣的:

img_rgb_convert = colour.RGB_to_RGB(
    img_rgb,
    colour.RGB_COLOURSPACES['ProPhoto RGB'],
    colour.RGB_COLOURSPACES['sRGB'],
    chromatic_adaptation_transform='CAT02',
    apply_cctf_decoding=True,
    apply_cctf_encoding=True)

注意:由於ProPhoto RGB的色域比sRGB的色域更大,因此轉換可能會生成超出色域的顏色,為簡單起見,可以在步驟 4 或 5 或色域后將其裁剪在 [0-1] 范圍內使用專用算法映射。

ProPhoto RGB & sRGB

您需要在此處將 16 位分辨率(灰度)轉換為 8 位。

myImage = myImage * 255/65535

然后matplotlib就能顯示了。

如果需要,將您的浮點數轉換為 int。

myImage = myImage.astype(int)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM