顏色校正矩陣(CCM)

Image Quality Video Series: Color Accuracy▶
影像品質影片系列:色彩準確度

介紹

「顏色/色調互動式」和「自動」功能可以根據至少包含 9 個不同色塊的色卡影像計算顏色校正矩陣 (CCM) 。通常建議使用 3x3 CCM,但也支援 4x3。使用價格低廉且廣泛使用的24 色塊 X-Rite Colorchecker通常可以獲得出色的校正效果。 CCM 可套用於影像以實現最佳色彩還原,最佳色彩還原定義為校正後的色塊與對應參考值之間的最小均方色差。

預設色彩誤差參數是 ( ΔE<sub>2000</sub> ) <sup>2 </sup>(或 ( ΔE<sub>94</sub> ) <sup>2</sup> ,兩者非常相似)的平均值,計算物件為所有滿足 5 ≤ L * ≤ 98(其中LL * 定義色彩的色塊(即色塊未飽和)。此矩陣的計算採用非線性最佳化方法。

CCM 可用於電影工作流程中的輸入裝置轉換 (IDT),例如學院色彩編碼系統。當使用多台不同的攝影機拍攝相同場景時,它可用於實現色彩一致性。

在設定顏色矩陣計算時,影像的正確線性化至關重要,因為矩陣運算需要線性的 R、G、B 值。針對不同的影像編碼,有多種線性化選項可供選擇。

操作順序——流程圖

簡要說明:首先準備一張未經校正的色卡影像。該圖像無需關聯任何色彩空間。 RAW 格式影像效果最佳。檢查其色調響應曲線,確定所需的線性化程度,然後選擇設定(包括目標色彩空間和參考文件)。點選「校正矩陣」按鈕,執行優化器,找到顏色誤差平方和最小的矩陣。

色彩校正矩陣 (CCM) 計算工作流程

數學

矩陣

彩色影像儲存在m × n × 3 的陣列中( m行(高度) × n列(寬度) × 3 種顏色)。為簡單起見,我們將輸入的彩色影像轉換為k × 3 的數組,其中k = m × n 。原始(未經校正和線性化的*輸入)像素數據可以表示為

其中第i行的條目,分別表示像素i的歸一化和線性化*後的 R、G 和 B 值。變換(校正)後的陣列稱為這是透過矩陣乘法計算得出的。 顏色校正矩陣, Imatest 讓您可以選擇兩種不同的形式可以是 3x3 或 4x3。 (4x3 已不再推薦;除非收到用戶回饋,否則可能會棄用。)

( (是一個 3 x 3 矩陣)

每個輸出(校正後)像素的 R、G 和 B 值都是該像素三個輸入顏色通道的線性組合。

*註:這些公式假設原始(輸入)數組是影像亮度的線性表示。如果影像檔案不是線性的(例如,sRGB 或 Adobe RGB 色彩空間),必須先將其線性化,然後才能將其輸入矩陣計算;計算結果可能需要應用伽馬曲線(即進行去線性化)。詳情請參閱下文「線性化」部分。

案例 2 (即將棄用): (是一個4x3矩陣;通常建議使用 3x3 矩陣。 )在 A 矩陣後面附加一列 1,以提供每個顏色通道的偏移量,由 指示。 , , 和這使得校正後的顏色值成為原始輸入的仿射變換。

計算的目標是最小化以下兩者之間的差異(以下面描述的某種選定指標來衡量):以及參考數組(理想的圖表值)初始值為(優化的起點)對於 3 x 3 和 4 x 3 的情況分別為:

在哪裡

參考數組和原始數組其中平均值是對所有情況取的。 。

Color/Tone requires a reference array R for each chart type. (Sometimes— for example with the X-Rite Colorchecker— more than one is available). R typically contains CIELAB (L*a*b*) values, which can be converted to RGB or used to calculate the color difference metric (ΔE, ΔC, ...). You can

  • use the default (built-in) reference,
  • enter a reference file that you can obtain by measuring the chart (see Measuring test chart patches) or from a web page, for example, from X-Rite or Babelcolor for the X-Rite Colorchecker
  • enter a reference file created from the L*a*b* values of a high quality "gold standard" chart image, as described here.

In the Color/Tone Interactive module, you can press File, Copy L*a*b* reference to clipboard to get the current reference values. A few values for the Colorchecker are shown on the right. A small crop from the X-Rite page is shown below.

37.31 13.39 14.58
64.37 18.05 17.05
49.62 -1.162 -22.16
43.35 -14.62 22.86
55.18 12.16 -24.57
70.67 -31.91 0.08472
62.11 33.4 55.77
40.05 16.27 -44.37
50.06 48.12 15.6
30.21 24.4 -20.88
71.52 -28.38 58.85
70.96 14.79 67.25
29.15 21.68 -48.74
54.35 -42.65 32.87
41.82 50.35 27.36
(24 rows total)

線性化

雖然大多數標準(非HDR)影像感測器在飽和之前都是線性的,但許多影像檔案具有高度非線性。 Imatest 處理兩種主要類型的映像檔。

  • 「RAW」檔案是從感測器輸出轉換而來,未經伽瑪曲線校正(通常也幾乎不進行訊號處理,例如銳利化、降噪、白平衡等)。這些文件呈線性關係,伽瑪值接近1(由於鏡頭光暈和感測器訊號處理(添加基座)的影響,通常略低於1)。 CCM計算首選RAW文件,因為用於獲得伽馬編碼的可互換文件的處理過程可能會造成一些資訊損失(尤其是在sRGB色彩空間下)。

  • 設計為可互換且以指定的伽瑪值 ( γ ) 顯示的文件,其中顯示亮度 =像素等級γ 。 (表示為色調響應曲線,對數亮度= γ × 對數像素等級)。

這些文件通常都關聯著某種色彩空間(該色彩空間可能嵌入在文件中,也可能沒有嵌入)。最常用的色彩空間(sRGB(約 2.2)和 Adobe RGB(1998))的 Gamma 值為 2.2。

相機在對影像進行編碼(RAW轉換過程的一部分)時,會應用一條色調響應曲線(像素值對數與曝光量的對數關係),該曲線近似於顯示曲線的反比:斜率可能與1/ γ有較大差異,並且通常在色調響應曲線中包含一個“肩部”(對比度降低的區域),以最大限度地減少高光過光。肩部透過使反應更「膠片化」來提高影像質量,但可能會降低對比度補償(CCM)的精度。

CCM 計算的前提是應用於影像的任何影像處理都是均勻的,且各個顏色均未飽和。應用局部色調映射後,無法計算出良好的 CCM 值。

如果輸入影像經過伽瑪編碼,則在應用校正矩陣之前必須對其進行線性化。 Imatest 提供了幾種線性化選項,如下所述。選項 1 和 5-8 對輸入影像進行線性化。選項2-4 假設輸入影像是線性的。

對於5、6 或 9 之外的線性化設置,您可以透過在「顏色/色調互動式」中開啟測試圖表影像,然後查看右側顯示的黑白密度顯示(對數像素等級與對數曝光),找到確定線性化設定所需的資訊(如下所述)。

這條曲線的伽瑪值(平均斜率)為 0.547,並且有一個響應「肩部」。原始文件(更適合 CCM 計算)的斜率(伽瑪值)通常接近 1,並且沒有肩部。

一個合理的(但遠非完美的)線性化設定是 7。使用伽瑪值線性化輸入…在線性化設定下拉式選單下方的框中將伽瑪值設為 0.55。使用設定 5 或 9 可以獲得更好的結果,因為這兩個設定不對伽馬值做任何假設:它們直接從影像中的灰階區塊測量伽馬值。對於伽馬值接近 1 的 RAW 影像,設定 5 就足夠了。

優化步驟

  • 開啟用於計算顏色/色調CCM 的圖像(互動式或自動)。

  • 選擇設置,其中大部分設置位於“設置”視窗中。
    輸入影像的色調響應(包括伽瑪值)(如上圖所示)用於確定合適的線性化選項。如果選擇顏色空間伽瑪線性化,則OL = OL γ 。 (其中伽瑪 ( γ ) 由顏色空間指定,例如 Adobe RGB 為 1/2.2)。
    請確保在“顏色/色調”視窗中選擇了正確的顏色空間和參考檔案。

  • 按下校正矩陣按鈕即可呼叫優化器,
    • 計算(臨時)校正影像T L = O L A 。
    • (可選)移除線性化:使用色彩空間 gamma ( γ ) 的T = T L (1/γ ) 。
    • 計算每個色塊的T (轉換為 CIELAB 值,即 L*a*b* 值)與參考(理想)色塊R之間的顏色誤差。顏色誤差指標在「最佳化」下拉式選單中選擇,是以下標準色彩誤差測量方法之一:ΔE* ab 、ΔC* ab 、 ΔE94 、 ΔE94 、 ΔECMC 、 ΔCCMC 、 ΔE00或ΔC00 (詳見此處) 。 ΔE00 (CIEDE2000) 或ΔE94  建議選項為:[在為 a*b* 顯示添加色差橢圓之前,我們擔心 ΔE 00可能包含一些小的不連續性,從而影響最佳化。 ] ΔC 誤差與 ΔE 類似,只是省略了亮度 ( L *) 分量。不建議使用 ΔC,因為 L*a*b* 色彩空間的色度 ( a * 和b *) 分量與亮度 ( L *) 分量之間存在交互作用,選擇 ΔC 值時,色度實際上會降低精度。
    • 使用非線性最佳化,調整A直到找到誤差度量平方和的最小值(通常是 ∑(ΔE 00 ) 2或 ∑(ΔE 00 ) 2 ,對於 5 ≤ L * ≤ 98 的補丁)。
    • 報告A的最終值。

在應用A 時(通常在Imatest之外),應使用類似的線性化方法。 A也可以在 RAW 轉換過程中應用,無需線性化,在應用伽馬曲線和色調響應曲線之前即可。

不能保證A是全域最小值。它的最終值在一定程度上取決於它的初始值。

顏色/色調中的顏色校正矩陣

選項:您可以透過在「顏色/色調互動」視窗中點選「設定」 > 「顏色矩陣」 ,或在設定視窗中點選「顏色矩陣、ISO感光度、MXN圖表設定」按鈕來設定顏色矩陣計算選項。這將開啟如下所示的對話框。選項如下:

  • color_matrix_settings2 4x3 或 3x3 矩陣:顏色校正矩陣的大小。通常建議使用 3x3 矩陣。 4x3 矩陣包含一個直流偏移(常數)項,這會降低計算速度,而且很少能改善結果。
  • 最佳化:選擇顏色誤差參數,使其在 L*>10(L*95 接近黑色)的色塊上的均方值最小化。可選參數包括 ΔE<sub>ab</sub>、ΔC<sub>ab</sub>、ΔE<sub>94</sub>、ΔE<sub>94</sub>、ΔE<sub>CMC</sub>、ΔC<sub>CMC</sub>、ΔE<sub>00</sub> 及 ΔC<sub>00</sub>,詳見此處。建議使用 ΔE<sub>94</sub> 或 ΔE<sub>2000</sub>,因為它們對高飽和度(飽和度高;a*<sup> 2 </sup> + b*<sup> 2 </sup> 值大)顏色之間的色度差異賦予的權重較低,也就是說,它們比 subB<sub空間中顏色之間的幾何距離)更接近人眼的感知。
  • 權重:設定用於優化的各個補丁的權重。選項:
    • 1. 等權重[預設] 所有色塊權重相等。這可能不是最佳設置,因為高光顏色在視覺上可能比陰影顏色更突出。
    • 2. 強調高光:根據 CIELAB L* 值賦予權重。賦予視覺上顯著的高光區域更高的權重。這是預設值。
    • 3. 重點突出高光:根據 L*^2 加權。
    • 4.從 CSV 檔案讀取權重如果選取此項,則會啟動「複製權重」、「瀏覽」和「檔案」複選框。 CSV 檔案中的權重數量(通常在 0 到 1 之間)應與圖表中的色塊數量相同。檔案可以每行一個值,也可以每行m個值,共n行,只要m*n等於圖表中的色塊數量即可。
以下是 140 塊(10 行 x 14 列)Colorchecker SG 的權重範例。

0,0,0,0,0,0,0,0,0,0,0,0,0,1
0,0,0,0,0,0,2,0,1,1,0,0,0,0
1,0,0,0,1,1,3,0,1,1,0,0,0,0
0,1,0,0,0,0,0,1,0,1,0,1,1,0
0,0,1,0,0,1,1,0,1,1,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,1,0,0,0,0,0,0,0
0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,1,0,0,0,0,1,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0

輸入權重檔案並計算出 CCM 值後,按下「數字」複選框(位於「顏色/色調」視窗右側)會顯示色塊編號(顯示 SG 的 Colorchecker 24 複製部分)和權重。這有助於驗證是否已輸入正確的權重。
  • 線性化:在計算矩陣之前,選擇影像線性化的方法。對於大多數設定(除 5、6 和 9 外),您需要知道輸入影像的色調響應(編碼),它可以是線性的(通常用於原始影像)、伽馬編碼的(使用手動輸入的伽馬值 (γ) 或所選顏色空間(sRGB、Adobe RGB 等)的伽馬值)或對數編碼的。響應可以從圖表灰階部分的黑白密度圖中獲得。伽瑪編碼顏色空間的線性化公式為O L = O 1/γ 。伽瑪編碼的公式(在計算 CCM 之後)為O = O L γ 。

    對於設定 5、6 和 9,您無需了解影像的編碼方式。線性化參數透過對灰階資料進行多項式擬合來確定(對於設定 5 和 6,擬合灰階區塊等級L;對於設定 9,擬合log10 ( L )),使用 Matlab 的polyfit和polyval函數。
環境評論線性化方程式:線性水平 =
1. 將輸入線性化(CS gamma),套用矩陣變換,然後套用 CS gamma 編碼。對於以標準色彩空間(CS)編碼的影像來說,這是一個合理的選擇。輸入1/(CS 伽瑪)
2. 不進行線性化:將矩陣應用於輸入像素適用於實驗以及起始和保持線性的影像。不適用於伽瑪編碼影像。輸入
3. 假設輸入為線性輸入,應用矩陣變換,然後應用壓縮感知伽瑪編碼。對於未進行伽瑪編碼(接近線性)但需要轉換為色彩空間的影像,在將輸入的 RGB 影像轉換為 L*a*b* 影像時,不會套用色彩空間 (CS) 伽瑪值。輸入
4. 假設輸入輸出呈線性關係(γ = 1)。 不進行線性化或伽瑪編碼。 RGB 和 L*a*b* 色彩空間轉換時,不應用色彩空間伽瑪校正。 (同第 2 點)輸入
5. 將輸入線性化(資料擬合),並應用矩陣,應用壓縮感知伽瑪編碼(相當精確) 使用三階多項式擬合P (Matlab 的 polyfit 函數)將影像線性化到灰階影像區塊的像素層級L。計算 CCM,然後使用 gamma 色彩空間進行編碼。這通常會得到不錯的結果。 polyval( P , input),其中P是對L進行擬合的三階多項式。
6. 將輸入線性化(資料擬合),套用矩陣,然後進行去線性化(資料擬合)與 5 相同,只是優化後影像恢復到原始色調曲線。同第5點。
7. 使用伽瑪變換(如下)對輸入進行線性化,應用矩陣變換,然後應用壓縮感知伽瑪編碼。手動輸入伽瑪值,如果色卡採用灰階模式,則可以從黑白密度圖中獲得該值。在測量伽瑪值與預期色彩空間伽瑪值或 1(線性原始轉換)有差異的常見情況下,此方法可獲得極佳的結果。當輸入影像的伽瑪值與標準色彩空間伽瑪值(通常為 1/2.2)或線性值(1)不同時,此設定尤其有用。輸入1/伽馬
8. 使用對數斜率進行線性化(對於對數色彩空間,見下文),應用矩陣,然後進行伽瑪編碼(CS)

對數色彩空間(有時用於電影,但從不用於靜態攝影)的特徵在於其近似編碼方程式: O = max(1+A log 10 (O L ), 0) ,其倒數(用於線性化)為: OL = 10^((O-1)/A) 。 A為對數斜率,顯示在「顏色/色調互動」模組的黑白密度和白平衡顯示。當選擇「像素與輸入密度」選項(4.0 版本新增)時,對數編碼色彩空間具有近似直線響應;而當選擇更傳統的「對數(像素)與輸入密度」選項時,伽瑪編碼色彩空間具有近似直線響應。

9. 線性化(伽瑪多項式資料擬合),應用矩陣,應用 CS 伽瑪編碼。 使用以灰階塊等級L的log10為底的三次多項式P對影像進行線性化。計算 CCM,然後使用伽馬色彩空間進行編碼。這是伽瑪編碼的一種多項式改良。推薦此方法的原因在於:(A) 它不需要了解輸入影像的編碼;(B) 它能為各種影像提供最精確的結果。 polyval( P ,log 10 (input)),其中P是對 log 10 ( L ) 進行擬合的三階多項式。

注意:對於 Rec. 709 色彩空間(允許值介於 16 和 235 之間,共 255 個值),線性化將 16-235 映射到完整的 0-1(內部)範圍,而去線性化將 0-1 映射回 16-235。影像以全範圍顯示。

  • Gamma (僅在線性化設定7 中啟用:使用輸入 gamma 進行線性化... )。手動輸入從灰階階梯圖(大多數顏色圖表都包含該圖表,並顯示在黑白密度圖中)測量的 gamma 值。
  • 色度倍增器(僅供參考)通常為 1。增大此值可獲得更飽和的顏色;減小此值可獲得較不飽和的顏色。有時將其增大到 1.05 甚至 1.1 可獲得更好的效果。
  • 優化約束
    • 無任何限制。這是預設設置,除非有充分理由,否則不應更改。
    • 各行之和為 1。
    • 各列之和為 1。這樣可以保持白平衡。
  • 計算詳情:有兩種計算方式可供選擇:(1)直接 RGB輸入到 RGB輸出,以及(2)RGB輸入到 XYZ(間接到 RGB輸出)。兩種方式都使用優化器:它們首先給出一個初始猜測值,然後優化器會不斷調整數值,直到找到所選誤差指標的最小值。
    • 直接計算 RGB 矩陣(原始演算法)首先猜測 RGB輸入到 RGB輸出矩陣,然後從 RGB輸出找到 L*a*b*輸出。在最佳化器的控制下調整矩陣,使顏色誤差(L*a*b*輸出與參考值之間的誤差,如果 ≠ 1,則透過色度乘數進行調整)最小。
    • 計算 XYZ 矩陣和 xy 原色(新演算法)。首先粗略估計 RGB輸入到 XYZ 矩陣的轉換結果(使用 sRGB 係數)。然後將其轉換為 L*a*b* 格式,並在優化器的控制下調整矩陣,直到選定的誤差指標最小化。優化完成後,將 XYZ 轉換回 RGB輸出。 RGB 到 XYZ 和 RGB 到 RGB 的矩陣都已計算並包含在 CSV 和 JSON 輸出檔中。
  • 參考檔案(位於「色彩/色調互動」視窗中;而非「色彩矩陣」視窗中)參考檔案包含用於最佳化的理想色卡 L*a*b* 值。通常,它包含色卡色塊的色度測量 L*a*b* 值。預設值始終如此,參考文件通常也是如此,但如果需要特殊的“外觀”,則參考文件可以包含不同的值,如下文“匹配圖像”部分所述。

影像匹配-使用“黃金標準”影像

如果您有一張色彩品質很高的影像(通常稱為「黃金標準」),並希望將其用作計算色彩校正模型 (CCM) 的參考(目標),以便其他影像盡可能地與之匹配,您可以將該影像的 L*a*b* 值儲存到一個命名檔案中。方法是:在「顏色/色調互動」視窗中,按一下「檔案」 ,然後選擇「將 L*a*b* 結果另存為 CSV 參考」 。之後,您可以透過按一下「參考(參考文件)」框,選擇「LAB 資料檔案」 ,然後選擇已儲存的文件,將此文件用作參考文件。

使用黃金標準的 L*a*b* 值作為合格/不合格標準有一個微妙但重要的優勢。由於一些複雜的原因(例如,人眼作為 L*a*b* 色彩空間的基礎,其反應與相機不同),三色影像永遠無法與理想的 L*a*b* 值完全匹配:最小平均ΔE 2000通常約為 3。但是,三色影像可以與黃金標準的L*a*b* 值完全匹配。這使得色差指標成為衡量色彩匹配度的更好指標。

取得測試圖表的圖像

構圖——圖表無需充滿整個畫面,尤其是在光線衰減嚴重的相機上——這在具有明顯桶形畸變的廣角鏡頭中很常見。大多數情況下(像素極低的相機除外),將圖表放置在畫面中心三分之一處(線性測量)就足夠了。

背景-應避免畫面內或畫面附近出現強光,因為強光會產生眩光,使陰影模糊,難以精確校正。理想的背景是中性色(反射率約18%)到深灰色,但只要在進行色彩校正之前不進行色彩校正,背景顏色本身的影響並不大。

影像處理-如果可能,在進行色彩校正模型 (CCM) 計算之前,應盡量減少影像處理。調整顏色和/或將影像轉換到特定色彩空間會降低精度。 (這正是 CCM 的工作原理。)應避免局部色調映射:它會徹底破壞計算結果。

飽和度-請盡可能避免任何色塊飽和。如果色塊飽和,即任何通道的平均像素值超過位元深度最大值的 99%(例如,位元深度為 8 時為 255;位元深度為 16 時為 65535),則這些色塊將從最佳化過程中排除,並在分割視圖中標記為「飽和」 。色塊飽和可能並不明顯,尤其是在三個通道中只有一個通道飽和的情況下(如下所示)。應用矩陣後,飽和的色塊看起來往往非常奇怪(見下文)。 (這看起來像是一個錯誤,但事實並非如此,如下所述。)

colorchecker_saturated_small飽和

右側影像顯示了一塊飽和區域(第 4 行,左側) 。由於只有綠色通道飽和,因此並不明顯。從下方所示的密度響應曲線(來自「顏色/色調互動式」或「顏色/色調自動」 )可以明顯看出這一點:綠色通道在最大曝光時飽和,並且綠色曲線的斜率在略低於最大曝光時開始下降。

因此,綠色通道的像素等級(相對於其他色塊)比未飽和時的像素等級要低。

colorchecker_saturated_density 顏色檢查器_飽和度校正左下角飽和色塊的校正值(底部顯示-它是洋紅色!)不正確,因為飽和的綠色通道比色塊未飽和時的值要低。

注意:飽和色塊不包含在矩陣計算中。雖然我們建議避免使用飽和色塊,但它們對計算出的矩陣影響不大。

Imatest 如何處理飽和像素( Imatest 5.0+):當輸入檔案中的 R、G 或 B 像素飽和(歸一化資料中的值為 1)時,應用矩陣後,該像素值將保持飽和狀態,即矩陣不會應用於飽和的(R、G 或 B)像素。此功能由以下範例程式碼中的一行實作。

correctedRGB(linearRGB==1) = 1;

右側圖片展示了校正後的結果。左下角水瓶上的青色高光是未校正飽和度造成的。

CCM 已套用於下方影像。
左圖未進行飽和度校正;右圖已進行校正。

類似的處理方法也適用於相機。這種方法無法(也無法)在飽和區域邊界處給出完美的結果,這些區域通常會出現「紫邊」現象。 ( 維基百科上的解釋有誤,我可能會嘗試修正。)

為了計算顏色校正矩陣,

  • 顏色校正(矩陣計算)按鈕

    使用“顏色/色調互動式”或“顏色/色調自動”開啟影像。

  • 根據黑白密度顯示中的密度響應曲線確定線性化設定。

  • 設定顏色矩陣設置,特別注意線性化,使其與黑白密度顯示保持一致。

  • 選擇參考文件,其中包含用於顏色校正的目標值。大多數情況下使用標準預設值,但您也可以輸入透過分光光度計測量或保存高品質(「黃金標準」)影像的 L*a*b* 值建立的參考檔案。

  • 按下右側所示的校正矩陣按鈕。顯示器將會發生變化,如下所示:理想(參考)顏色仍位於每個色塊的左上角,輸入顏色仍位於右上角,校正後的顏色則顯示在底部。輸入影像(來自我們的存檔)的白平衡相對較差。校正後的改善效果非常顯著。

多圖拆分修正分割視圖,顯示參考色、輸入色和校正後的色塊顏色。下拉式選單顯示
顯示輸入(在右側)可變更為顯示校正值,以獲得[校正後 - 理想]統計資料。

“校正矩陣”按鈕變為“矩陣已計算” ,並以粉紅色背景高亮顯示。只有當影像屬性發生變更(例如,新影像、色彩空間、參考檔案或色彩矩陣設定)時,才能重新計算校正矩陣。其左側的「顯示輸入」 (或「已校正」 )下拉式選單將啟用。您可以從以下兩個選項中選擇一個。

顯示輸入大多數顯示器都會顯示顏色差異(輸入 - 理想值),而左下角的文字會顯示[輸入 - 理想值]顏色差異。有兩個顯示器不受此設定的影響:偽彩色顏色差異和分離顏色,其中底部會顯示(校正值 - 理想值)。
顯示已修正顏色/色調互動式校正增量大多數顯示器都會顯示色差(校正後 - 理想值),左下角的文字也會顯示[校正後 - 理想值]色差。以下是上述情況的校正後色差。

EXIF 資料和色彩矩陣顯示包含結果摘要。

顏色/色調互動式_exif_colorcorr Exif 和色彩矩陣視圖

圖中顯示了顏色校正矩陣、結果摘要以及[輸入 - 理想]和[校正後 - 理想]顏色差異摘要。初始誤差和最終誤差數值顯示了所選指標(在本例中為所有 L*>10 和 L* 值大於 10 的色塊的 Delta-E 94 平方和)的校正效果。

原始影像結果

以下是一個針對原始影像進行色彩矩陣最佳化的範例。原始影像由松下GF1微型4/3系統(無反可換鏡頭)相機拍攝,格式為RAW(RW2)(同時拍攝了JPEG格式作為參考)。使用dcraw軟體轉換,設定參數為:手動模式,標準RAW轉換,輸出伽瑪值=1.0(線性),自動白平衡關閉(未勾選),白平衡無,輸出色彩空間=RAW。除去馬賽克外,未應用其他影像處理。

該文件幾乎完全呈線性:音調響應曲線是一條直線,gamma = 1.01。選擇了線性化選項 3 (假設線性輸入,應用矩陣,然後應用 CS gamma 編碼。 )。

輸出效果近乎完美,對於三色感光元件而言已臻極致。這與使用特徵明確的RAW影像進行處理後的預期效果相符。我們最近(2014年5月)使用四款支援RAW輸出的相機(松下Lumix LX7和G3、佳能EOS-6D以及尼康D800E)在六種不同的光照條件下(2700K和5000K LED燈、3500K和5000K CFL燈、標準(2700K)白熾燈以及4700K(實測4000K)SoLux(二向色濾鏡)鹵素燈)測試了此計算方法,並獲得了色彩校正後影像高度一致的結果。

松下原色矩陣線性原始文件處理結果(伽瑪值 = 1;無顏色校正)

線性矩陣結果 「x、y 和 X、YZ 原色」功能(互動式和自動色彩/色調)可以計算輸入(相機)色彩空間的 x、y 和 X、YZ 原色,並將它們顯示出來(右側底部三行),然後儲存為 CSV 和 JSON 輸出檔。當輸入影像為線性影像(從原始影像轉換而來,沒有伽馬曲線)或處於 ACES 色彩空間時,此計算效果最佳。它可用於計算訊號處理係數。請注意,x、y 原色與相機的色域無關。這些原色是對應於 R、G、B = {max,0,0}、{0,max,0}、[0,0,max} 的 x 和 y 值,由於感測器中的顏色串擾,這些值在實際應用中無法達到,並且通常位於真實顏色的光譜軌跡之外。

顏色差( ΔExx和ΔCxx )能達到多好?

它們不可能做到完美,因為三色相機(近似為紅、綠、藍; RGB )中濾色片的光譜與人眼濾色片(近似為黃橙、綠、藍)的光譜不同。相機無法完全複製人眼,因為要獲得良好的色彩還原,必須將顏色轉換為RGB,而這會嚴重降低訊號雜訊比(SNR)。

上述範例中的數值, ΔE * ab ≅ 5、 ΔE * 94和5ΔE00 ≅ 3 ,對於三色相機(包括所有標準彩色相機)而言,已經是我們見過的最佳結果之一。我們唯一一次看到更好的結果,即ΔExx < 1,是在至少有七個通道的多光譜相機上。

從 Color/Tone Interactive 儲存矩陣

若要將矩陣儲存至檔案(CSV 格式),請按一下「檔案」 ,選擇「將色彩矩陣儲存至檔案」 ,然後選取檔案名稱。

點選「檔案」選單,選擇「複製顏色矩陣到剪貼簿」 ,即可將矩陣複製到剪貼簿。然後,可以將剪貼簿內容貼到影像處理模組的「設定CCM」視窗中。

當您按下「色彩/色調互動式」視窗底部的「儲存資料」按鈕時,矩陣將包含在 CSV 輸出檔案中(預設儲存在影像檔案資料夾的「結果」子資料夾中)。

CSV 檔案顏色校正矩陣

應用矩陣—影像顏色校正

在Color/Tone Interactive中計算出 CCM 後,此矩陣可用於校正任意影像。我們描述了三種方法。

1. 在「顏色/色調互動」中套用矩陣

計算出 CCM 後,在「色彩/色調互動式」視窗右側的「顯示」方塊中選擇13.讀取 - 顏色校正 - 儲存影像。

左側初始顯示幕會顯示「按『讀取影像進行校正』」的訊息,如果校正後的影像沒有問題,請按「儲存校正後的影像」。您可以按「讀取影像進行校正」或「校正目前影像」 。

在右側的範例中,對 Colorchecker 和 Gallery 的圖像套用了 CC20C(青色)數位濾鏡。計算了濾鏡後 Colorchecker 影像的顏色校正矩陣,然後選擇了「13. 讀取 - 顏色校正...」 。讀取濾鏡後的 Gallery 影像,並立即使用顏色校正矩陣進行校正。校正前的影像和校正後的影像分別顯示在右上角和右下角。

儲存校正後的影像。

多圖_向量示波器預覽
未校正和校正的影像

這種方法只適用於單張影像,不適用於大量影像。

2. 在 Imatest 影像處理模組中應用此矩陣

在Imatest 5.0 及更高版本中,可以使用影像處理模組將顏色校正矩陣(如上所述,從「色彩/色調互動式」功能儲存為 CSV 檔案)應用於單一影像或影像批次。為此,請選取影像處理視窗左側的「CCM(色彩矩陣)」複選框。此矩陣會在高度非線性色調映射和雙邊濾波操作之前套用。

點選複選框右側的「設定 CCM」按鈕,即可輸入或檢視 CCM 設定。關鍵設定包括線性化(如上所述)、色彩空間、輸入伽瑪(用於一種線性化設定)和矩陣乘數(可以使影像變亮或變暗;通常設定為 1)。

影像處理的 CCM 設定

影像處理可以透過選擇多個影像而不是單一影像來處理一批影像。如果選擇了一批映像,則名為root_file_name.ext的檔案將自動儲存為root_file_name – ext -improc.png。

3. Apply the matrix externally with Matlab code

Colorcheck_1_raw_1004W
Uncorrected image

The CCM can be applied outside of Imatest. We show an example, using Matlab, of how to apply the matrix. You can try this out if you have Matlab (or convert it into another language like C or Python if you don't).

The uncorrected 24-patch Colorchecker image shown on the right is used as the input to the Color Correction Matrix calculation. It was derived from a raw image, converted to a JPEG file with no color correction, then reduced. You can click (or right-click) on it to download it.

This image was read into Color/Tone Interactive, then color-corrected with the following settings.

Optimize: Delta-E 00

Linearization:  Assume linear input, apply matrix, then apply Color Space gamma encoding.

Weighting:  2. Emphasize highlights

Chroma multiplier:  1.06

Calculate XYZ matrix...

Here are the results of the correction. The corrected colors are extremely accurate— better than we usually get when we apply the matrix to an image that has already been processed (ΔEab mean = 5.32; ΔE00 mean = 3.11).

Colorcheck_1_multicharts_corr

The Color Correction Matrix was obtained by clicking File, Copy color matrix to clipboard, then pasting directly into this page. You can copy it from this page if needed.

1.48663 -0.192007 0.033443
-0.612018 2.03673 -0.796356
-0.367863 -0.580001 3.04927

Colorcheck_1_corrected_display
Corrected image

The program for applying the CCM to an image file is in the box below. It was updated July 2020 to make it much easier to run— with a simple Graphic User Interface. The core calculations, involving variable correctedRGB, can be used as a template for developing custom code. 

To load the program into your system, select the text in the box, copy it to the clipboard (control-C), paste it into the Matlab (or other) editor, then save as an m-file (ccm_test.m).

Before you run ccm_test you should calculate a CCM using the Color/Tone module. If you don't have an image of your own to test, download the uncorrected image (above) and copy the 3×3 CCM (also above) to the clipboard. 

To run ccm_test  from the Matlab command window.

  1. If possible, copy the CCM to the clipboard (using the File dropdown in the Color/Tone module or Control-C in a text file). You can select the 3×3 CCM text (above) in the browser window, then copy it (control-C).
  2. Enter ccm_test.
  3. A window with basic instructions opens. Click OK.
  4. A narrow window opens where you can
    1. enter gamma (1 for uncorrected file (above): you can derive gamma from the density plot in Color/Tone Interactive)
    2. enter the CCM (easiest if you paste it from the clipboard).
  5. A window opens that lets you browse to the image file and open it.
  6. The corrected image appears. You can save it if you wish.

An output image (the above input image, corrected) is shown on the right. 

function ccm_test
% Test program for applying Color Correction matrix.
% Output for display gamma = 2.2 — sRGB and Adobe RGB color spaces.

uiwait(msgbox(['We recommend that you calculate the Color Correction Matrix (CCM),' newline ...
'and copy Color Matrix to the clipboard before running ccm_test.' newline newline ...
'After you click OK, two input dialog boxes will open.' newline newline ...
'1. a narrow box for entering the encoding gamma and entering or pasting the CCM.' newline ...
'2. A box for browsing and opening the image file to be corrected by the CCM.'], ...
'ccm_test instructions'));

answer = inputdlg({'Enter encoding gamma (typically 0.5-1)'; 'Paste or enter the 3×3 CCM into this box'}, ...
'Enter gamma and CCM', [1 20; 3 20]);
gamma = str2num(answer{1}); %#ok
ccmnum = str2num(answer{2}); %#ok
szcc = size(ccmnum); % Keep for diagnostics.
if isempty(answer{2}) || szcc(1)<3 || szcc(1)>4 || szcc(2)<3 || szcc(2)>4
ans2 = answer{2}; % sz2 = size(ans2),
ccmnum = [str2num(ans2(1,:)); str2num(ans2(2,:)); str2num(ans2(3,:))]
gamtemp = str2num(ans2(6,:)); %#ok
if isempty(answer{1}) && ~isempty(gamtemp)
gamma = gamtemp;
end
if isempty(ccmnum)
disp(['CCM is empty or badly-sized– try again.' newline 'szcc = ' num2str(szcc)]); 
return; 
end
end

[im,path] = uigetfile('*.*','Enter the image file to be corrected by the CCM'); % Find image file 
imagefile = fullfile(path,im);
if im==0 | isempty(path) | isempty(im), return; end %#ok

imageRGB = imread(imagefile); % Read the image file.
imtype = class(imageRGB); % Image type: typically uint8 or uint16.
imageRGB = double(imageRGB)/double(intmax(imtype)); % Normalize to maximum for image type.
figure; image(imageRGB);
title(['Original image: gamma = ' num2str(gamma)]); % Works without Image Processing Toolbox.

linearRGB = imageRGB.^(1/gamma); % Linearize the image (apply inverse of encoding gamma).

% Change to 2D to apply matrix; then change back.
[my, mx, mc] = size(linearRGB); % rows, columns, colors (3)
linearRGB = reshape(linearRGB,my*mx,mc); 
correctedRGB = linearRGB*ccmnum; 
correctedRGB = min(correctedRGB,1); correctedRGB = max(correctedRGB,0); % Place limits on output.
correctedRGB = correctedRGB.^(1/2.2); % Apply gamma for sRGB, Adobe RGB color space.
% Deal with saturated pixels. Not perfect, but this is what cameras do. Related to “purple fringing”.
correctedRGB(linearRGB==1) = 1; % Don't change saturated pixels. (We don't know HOW saturated.)
correctedRGB = reshape(correctedRGB, my, mx, mc);

figure; image(correctedRGB); title('Corrected image');

tosave = questdlg('Do you want to save the corrected image?','Save the corrected image?', 'Yes','No','No');
if strcmpi(tosave,'Yes')
[path,imroot,ext] = fileparts(imagefile);
imsave = [imroot '-CCM-corr' ext];
sfile = fullfile(path,imsave);
[savef, savepath] = uiputfile(fullfile(path,'*.*'), ...
'Enter a file name to save the CCM-corrected results; empty otherwise', sfile);
savefile = fullfile(savepath,savef);
imwrite(correctedRGB, savefile);
disp(['Results written to ' savefile]);
end

Links

Some of the background for the calculation can be found in Color Correction Matrix for Digital Still and Video Imaging Systems by Stephen Wolf, though the Imatest calculation differs in many respects: there is no issue with outliers and optimization is performed using one of the standard color difference metrics.