Wednesday, August 3, 2022

【疑難】白點和特定點在 sRGB 色彩空間上的等分計算

這篇是關於社團【色彩管理交流】內的成員求助,問題很有趣,所以來解答看看。

 

 

 

問題描述

社團內的朋友所問的問題如下圖截圖所示,給了一張 CIE 1976 USC Yu'v' 色度圖,給了兩點 RGB 資訊,希望能夠內插出三點 RGB 使得 Yu'v' 色度圖內的座標為四等距。

第一時間看到這個問題,直覺所想到的問題是資訊不足,在發光源的顯色系統中,沒給色彩空間(Color Space)資訊根本沒有辦法往下做下去,所幸後來原發文者有補充說明了這個色彩空間環境的 RGBW u'v' 色度座標,並進一步地說明是 sRGB 色彩空間。好,有色彩空間了,那問題就可以簡化成:

"在 sRGB 色彩空間下,給任意兩個 RGB 資訊,找出三組 RGB 資訊,使得這三組 RGB 資訊在 CIE 1976 u'v' 色度空間中,剛好坐落定於兩組 RGB 對應的 u'v' 座標直線上,將直線分成四等分。"

發文者所給的 RGB 數值分別為 (255, 128, 0) 和 (255, 255, 255),那麼底下就開始進行作業。

 

RGB 的正規化

首先要處理的是正規化的問題,從發文者的資訊推估,演色系統為 8 位元,因此將顏色正規化如下:

(01)C1=[2552551282550255]=[1.00000.50200.0000]

(02)C2=[255255255255255255]=[1.00001.00001.0000]

 

人眼感知線性化:RGB to RGB

已知色彩空間為 sRGB ,Gamma Expansion 函數如下:

(03)Γ(C)={C12.92if C0.04045(C+0.0551.055)2.4otherwise

根據式 (03) 計算 RGB 如下:

(04)C1=Γ(C1)=[1.00000.21590.0000]

(05)C2=Γ(C2)=[1.00001.00001.0000]

 

RGB to XYZ

已知色彩空間為 sRGB ,根據 sRGB 規範,可計算色彩轉換矩陣如下:

(06)Mt=[0.41245640.35757610.18043750.21267290.71515220.07217500.01933390.11919200.9503041]

計算 XYZ1XYZ2 如下:

(07)XYZ1=MtC1=[0.48960.36700.0451]

(08)XYZ2=MtC2=[0.95001.00001.0888]

 

XYZ to uv

XYZ to uv 轉換式如下:

(09)[uv]=[4XX+15Y+3Z9YX+15Y+3Z]

根據式 (09) 計算 [uv]1[uv]2 如下:

(10)[uv]1=[0.31950.5388]

(11)[uv]2=[0.19780.4683]

 

內插

將各自的 XYZ 內的 Y 將 u'v' 組合得到 Yu'v' ,根據線性內插,算出兩個 Yu'v' 的等分點如下:

(12)[Yuv]A=[0.68350.25870.5036]

(13)[Yuv]B=[0.52530.28910.5212]

(14)[Yuv]C=[0.88180.22820.4860]

 

Yuv to Yxy

Yuv 轉換成 Yxy 的轉換式如下:

(15)[Yxy]=[Y9u6u16v+124v6u16v+12]

根據式 (15) 計算 [Yxy]A[Yxy]B[Yxy]C 如下:

(16)[Yxy]A=[0.68350.42370.3666]

(17)[Yxy]B=[0.52530.48220.3865]

(18)[Yxy]C=[0.76260.36520.3570]

 

Yuv to Yxy

Yuv 轉換成 Yxy 的轉換式如下:

(19)[XYZ]=[xYyY(1xy)Yy]

根據式 (19) 計算 [YYZ]A[XYZ]B[XYZ]C 如下:

(20)[XYZ]A=[0.78990.68350.3910]

(22)[XYZ]B=[0.65550.52530.1785]

(22)[XYZ]C=[0.88960.84180.6911]

 

XYZ to RGB

XYZ 轉換 RGB 可以參考式 (07) 和式 (08) 的反矩陣轉換如下:

(23)[RGB]=Mt1[XYZ]

 

RGB to RGB

已知色彩空間為 sRGB ,Gamma Compression 函數如下:

(24)Γ1(C)={12.92Cif C0.00313081.055C12.40.055otherwise

 

結果

在式 (24) 完成後,須注意數值是否介於 0 和 1 之間,若否,則需進行 clamp 或者選擇適合的 intend 進行壓縮,之後將這些數值正規化到 255 後,取四捨五入整數。在這次的運算中發現正規到 255 後的數值超出 255 數值如下:

(25)[]A=[287.4324192.9386152.8445]

(26)[]A=[278.9999161.229796.4013]

(27)[]A=[280.6359224.0326204.6895]

為避免這些大於數位訊號能顯示的範圍,必須進行數值限縮,這邊採用等比壓縮法,但這個方法並非合理的限縮方式,但針對貼文者的需求,應該是足夠了。最終結果如下:

(28)[]A=[255.0000171.1684135.5983]

(29)[]A=[255.0000147.360588.1088]

(30)[]A=[255.0000203.5673185.9913]

 

No comments:

Post a Comment

熱門文章