![]() |
OpenCV 4.12.0
開源計算機視覺
|
色彩校正的目的是將輸入和輸出裝置的色彩響應調整到已知狀態。被校準的裝置有時被稱為校準源;用作標準的色彩空間有時被稱為校準目標。色彩校準已廣泛應用於許多行業,如電視製作、遊戲、攝影、工程、化學、醫學等。由於輸入和輸出裝置的製造過程,通道響應存在非線性失真。為了校正裝置的影像輸出,有必要校準捕獲的顏色和實際顏色。
類 | |
| 類 | cv::ccm::ColorCorrectionModel |
| ccm 模型的核心類。 更多... | |
| enum cv::ccm::CCM_TYPE |
#include <opencv2/mcc/ccm.hpp>
ccm 可能型別的列舉。
| 列舉器 | |
|---|---|
| CCM_3x3 Python: cv.ccm.CCM_3x3 | 形狀為 \(3\times3\) 的 CCM 對顏色值執行線性變換。 |
| CCM_4x3 Python: cv.ccm.CCM_4x3 | 形狀為 \(4\times3\) 的 CCM 執行仿射變換。 |
| enum cv::ccm::COLOR_SPACE |
#include <opencv2/mcc/ccm.hpp>
| 列舉器 | |
|---|---|
| COLOR_SPACE_sRGB Python: cv.ccm.COLOR_SPACE_sRGB | https://en.wikipedia.org/wiki/SRGB , RGB 色彩空間 |
| COLOR_SPACE_sRGBL Python: cv.ccm.COLOR_SPACE_sRGBL | https://en.wikipedia.org/wiki/SRGB , 線性 RGB 色彩空間 |
| COLOR_SPACE_AdobeRGB Python: cv.ccm.COLOR_SPACE_AdobeRGB | https://en.wikipedia.org/wiki/Adobe_RGB_color_space , RGB 色彩空間 |
| COLOR_SPACE_AdobeRGBL Python: cv.ccm.COLOR_SPACE_AdobeRGBL | https://en.wikipedia.org/wiki/Adobe_RGB_color_space , 線性 RGB 色彩空間 |
| COLOR_SPACE_WideGamutRGB Python: cv.ccm.COLOR_SPACE_WideGamutRGB | https://en.wikipedia.org/wiki/Wide-gamut_RGB_color_space , RGB 色彩空間 |
| COLOR_SPACE_WideGamutRGBL Python: cv.ccm.COLOR_SPACE_WideGamutRGBL | https://en.wikipedia.org/wiki/Wide-gamut_RGB_color_space , 線性 RGB 色彩空間 |
| COLOR_SPACE_ProPhotoRGB Python: cv.ccm.COLOR_SPACE_ProPhotoRGB | https://en.wikipedia.org/wiki/ProPhoto_RGB_color_space , RGB 色彩空間 |
| COLOR_SPACE_ProPhotoRGBL Python: cv.ccm.COLOR_SPACE_ProPhotoRGBL | https://en.wikipedia.org/wiki/ProPhoto_RGB_color_space , 線性 RGB 色彩空間 |
| COLOR_SPACE_DCI_P3_RGB Python: cv.ccm.COLOR_SPACE_DCI_P3_RGB | https://en.wikipedia.org/wiki/DCI-P3 , RGB 色彩空間 |
| COLOR_SPACE_DCI_P3_RGBL Python: cv.ccm.COLOR_SPACE_DCI_P3_RGBL | https://en.wikipedia.org/wiki/DCI-P3 , 線性 RGB 色彩空間 |
| COLOR_SPACE_AppleRGB Python: cv.ccm.COLOR_SPACE_AppleRGB | |
| COLOR_SPACE_AppleRGBL Python: cv.ccm.COLOR_SPACE_AppleRGBL | https://en.wikipedia.org/wiki/RGB_color_space , 線性 RGB 色彩空間 |
| COLOR_SPACE_REC_709_RGB Python: cv.ccm.COLOR_SPACE_REC_709_RGB | https://en.wikipedia.org/wiki/Rec._709 , RGB 色彩空間 |
| COLOR_SPACE_REC_709_RGBL Python: cv.ccm.COLOR_SPACE_REC_709_RGBL | https://en.wikipedia.org/wiki/Rec._709 , 線性 RGB 色彩空間 |
| COLOR_SPACE_REC_2020_RGB Python: cv.ccm.COLOR_SPACE_REC_2020_RGB | https://en.wikipedia.org/wiki/Rec._2020 , RGB 色彩空間 |
| COLOR_SPACE_REC_2020_RGBL Python: cv.ccm.COLOR_SPACE_REC_2020_RGBL | https://en.wikipedia.org/wiki/Rec._2020 , 線性 RGB 色彩空間 |
| COLOR_SPACE_XYZ_D65_2 Python: cv.ccm.COLOR_SPACE_XYZ_D65_2 | https://en.wikipedia.org/wiki/CIE_1931_color_space , 非 RGB 色彩空間 |
| COLOR_SPACE_XYZ_D65_10 Python: cv.ccm.COLOR_SPACE_XYZ_D65_10 | 非 RGB 色彩空間 |
| COLOR_SPACE_XYZ_D50_2 Python: cv.ccm.COLOR_SPACE_XYZ_D50_2 | 非 RGB 色彩空間 |
| COLOR_SPACE_XYZ_D50_10 Python: cv.ccm.COLOR_SPACE_XYZ_D50_10 | 非 RGB 色彩空間 |
| COLOR_SPACE_XYZ_A_2 Python: cv.ccm.COLOR_SPACE_XYZ_A_2 | 非 RGB 色彩空間 |
| COLOR_SPACE_XYZ_A_10 Python: cv.ccm.COLOR_SPACE_XYZ_A_10 | 非 RGB 色彩空間 |
| COLOR_SPACE_XYZ_D55_2 Python: cv.ccm.COLOR_SPACE_XYZ_D55_2 | 非 RGB 色彩空間 |
| COLOR_SPACE_XYZ_D55_10 Python: cv.ccm.COLOR_SPACE_XYZ_D55_10 | 非 RGB 色彩空間 |
| COLOR_SPACE_XYZ_D75_2 Python: cv.ccm.COLOR_SPACE_XYZ_D75_2 | 非 RGB 色彩空間 |
| COLOR_SPACE_XYZ_D75_10 Python: cv.ccm.COLOR_SPACE_XYZ_D75_10 | 非 RGB 色彩空間 |
| COLOR_SPACE_XYZ_E_2 Python: cv.ccm.COLOR_SPACE_XYZ_E_2 | 非 RGB 色彩空間 |
| COLOR_SPACE_XYZ_E_10 Python: cv.ccm.COLOR_SPACE_XYZ_E_10 | 非 RGB 色彩空間 |
| COLOR_SPACE_Lab_D65_2 Python: cv.ccm.COLOR_SPACE_Lab_D65_2 | https://en.wikipedia.org/wiki/CIELAB_color_space , 非 RGB 色彩空間 |
| COLOR_SPACE_Lab_D65_10 Python: cv.ccm.COLOR_SPACE_Lab_D65_10 | 非 RGB 色彩空間 |
| COLOR_SPACE_Lab_D50_2 Python: cv.ccm.COLOR_SPACE_Lab_D50_2 | 非 RGB 色彩空間 |
| COLOR_SPACE_Lab_D50_10 Python: cv.ccm.COLOR_SPACE_Lab_D50_10 | 非 RGB 色彩空間 |
| COLOR_SPACE_Lab_A_2 Python: cv.ccm.COLOR_SPACE_Lab_A_2 | 非 RGB 色彩空間 |
| COLOR_SPACE_Lab_A_10 Python: cv.ccm.COLOR_SPACE_Lab_A_10 | 非 RGB 色彩空間 |
| COLOR_SPACE_Lab_D55_2 Python: cv.ccm.COLOR_SPACE_Lab_D55_2 | 非 RGB 色彩空間 |
| COLOR_SPACE_Lab_D55_10 Python: cv.ccm.COLOR_SPACE_Lab_D55_10 | 非 RGB 色彩空間 |
| COLOR_SPACE_Lab_D75_2 Python: cv.ccm.COLOR_SPACE_Lab_D75_2 | 非 RGB 色彩空間 |
| COLOR_SPACE_Lab_D75_10 Python: cv.ccm.COLOR_SPACE_Lab_D75_10 | 非 RGB 色彩空間 |
| COLOR_SPACE_Lab_E_2 Python: cv.ccm.COLOR_SPACE_Lab_E_2 | 非 RGB 色彩空間 |
| COLOR_SPACE_Lab_E_10 Python: cv.ccm.COLOR_SPACE_Lab_E_10 | 非 RGB 色彩空間 |
| enum cv::ccm::CONST_COLOR |
#include <opencv2/mcc/ccm.hpp>
帶有 2 度 D50 的 Macbeth 和 Vinyl 色卡。
#include <opencv2/mcc/ccm.hpp>
用於計算顏色之間距離的可能函式的列舉。
請參閱 https://en.wikipedia.org/wiki/Color_difference 瞭解詳情
#include <opencv2/mcc/ccm.hpp>
初始方法的可能型別的列舉。
| enum cv::ccm::LINEAR_TYPE |
#include <opencv2/mcc/ccm.hpp>
線性化變換型別。
色彩校正的第一步是對檢測到的顏色進行線性化。由於輸入色彩空間尚未校準,我們通常採用一些經驗方法進行線性化。有幾種常見的線性化方法。第一種是恆等變換,第二種是伽馬校正,第三種是多項式擬合。
線性化通常是逐元素函式。數學符號如下
\(C\): 顏色的任意通道,可以是 \(R, G\) 或 \(B\)。
\(R, G, B\): 分別為 \(R, G, B\) 通道。
\(G\): 灰度;
\(s,sl\): 下標,表示檢測到的資料及其線性化值,前者是輸入,後者是輸出;
\(d,dl\): 下標,表示參考資料及其線性化值
在恆等變換線性化過程中不進行任何更改,通常是因為輸入 RGB 影像的三刺激值已經與亮度成比例。例如,如果輸入測量資料是 RAW 格式,則測量資料已經線性,因此無需線性化。
恆等變換公式如下
\[ C_{sl}=C_s \]
伽馬校正是在 RGB 空間中執行非線性的方法,詳見色彩空間文件。線上性化部分,\(\gamma\) 的值通常設定為 2.2。您也可以自定義該值。
伽馬校正線性化公式如下
\[ C_{sl}=C_s^{\gamma},\qquad C_s\ge0\\ C_{sl}=-(-C_s)^{\gamma},\qquad C_s<0\\\\ \]
多項式擬合使用多項式進行線性化。如果多項式為
\[ f(x)=a_nx^n+a_{n-1}x^{n-1}+... +a_0 \]
則
\[ C_{sl}=f(C_s) \]
實際中,使用 \(n\le3\) 來防止過擬合。
多項式擬合有多種變體,區別在於生成 \(f(x)\) 的方式。通常需要使用線性化的參考顏色和相應的檢測顏色來計算多項式引數。然而,並非所有顏色都可以參與計算。需要去除檢測到的飽和顏色。詳見演算法介紹文件。
使用三個多項式 \(r(x), g(x), b(x)\) 分別對 RGB 色彩空間的每個通道進行線性化[1-3]
\[ R_{sl}=r(R_s)\\ G_{sl}=g(G_s)\\ B_{sl}=b(B_s)\\ \]
透過最小化檢測資料與線性化參考資料之間的殘差平方和來生成多項式。以 R 通道為例
\[ R=\arg min_{f}(\Sigma(R_{dl}-f(R_S)^2) \]
這等價於對以下方程尋找最小二乘迴歸
\[ f(R_{s1})=R_{dl1}\\ f(R_{s2})=R_{dl2}\\ ... \]
使用多項式,上述方程變為
\[ \begin{bmatrix} R_{s1}^{n} & R_{s1}^{n-1} & ... & 1\\ R_{s2}^{n} & R_{s2}^{n-1} & ... & 1\\ ... & ... & ... & ... \end{bmatrix} \begin{bmatrix} a_{n}\\ a_{n-1}\\ ... \\ a_0 \end{bmatrix} = \begin{bmatrix} R_{dl1}\\ R_{dl2}\\ ... \end{bmatrix} \]
這可以表示為線性方程組
\[ AX=B \]
當參考顏色數量不小於多項式次數時,線性系統存在最小二乘解
\[ X=(A^TA)^{-1}A^TB \]
一旦我們得到多項式係數,就可以得到多項式 r。
這種尋找多項式係數的方法可以透過 numpy 中的 numpy.polyfit 實現,表示為
\[ R=polyfit(R_S, R_{dl}) \]
請注意,通常情況下,我們希望得到的多項式在區間 [0,1] 上是單調遞增的,但這意味需要非線性方法來生成多項式(詳見 [4])。這會大大增加程式的複雜性。考慮到單調性不影響色彩校正程式的正確執行,程式實現仍使用 polyfit。
其他通道的引數也可以透過類似的方式得出。
在該方法[2]中,所有通道都使用單一多項式。該多項式仍然是檢測到的顏色到線性參考顏色的 polyfit 結果。但是,只有參考顏色的灰度可以參與計算。
由於檢測到的與參考顏色灰度對應的顏色不一定是灰色的,因此需要將其灰度化。灰度是指 XYZ 色彩空間的 Y 通道。檢測資料的色彩空間未確定,無法轉換為 XYZ 空間。因此,使用 sRGB 公式進行近似[5]。
\[ G_{s}=0.2126R_{s}+0.7152G_{s}+0.0722B_{s} \]
然後可以使用 polyfit 獲得多項式引數。
\[ f=polyfit(G_{s}, G_{dl}) \]
獲得 \(f\) 後,即可執行線性化。
對於伽馬校正公式,我們取對數
\[ ln(C_{sl})={\gamma}ln(C_s),\qquad C_s\ge0\ \]
可以看出 \(ln(C_s)\) 和 \(ln(C_{sl})\) 之間存線上性關係。可以認為該公式是多項式關係的近似,即存在一個多項式 \(f\),使得[2]
\[ ln(C_{sl})=f(ln(C_s)), \qquad C_s>0\\ C_{sl}=0, \qquad C_s=0 \]
因為 \(exp(ln(0))\to\infty \),所以在上述公式中,分量為 0 的通道直接對映為 0。
對於分別擬合通道,我們有
\[ r=polyfit(ln(R_s),ln(R_{dl}))\\ g=polyfit(ln(G_s),ln(G_{dl}))\\ b=polyfit(ln(B_s),ln(B_{dl}))\\ \]
請注意,\(ln(*) \) 的引數不能為 0。因此,我們需要從 \(R_s \) 和 \(R_{dl} \)、\(G_s\) 和 \(G_{dl}\)、\(B_s\) 和 \(B_{dl}\) 中刪除值為 0 的通道。
因此
\[ ln(R_{sl})=r(ln(R_s)), \qquad R_s>0\\ R_{sl}=0, \qquad R_s=0\\ ln(G_{sl})=g(ln(G_s)),\qquad G_s>0\\ G_{sl}=0, \qquad G_s=0\\ ln(B_{sl})=b(ln(B_s)),\qquad B_s>0\\ B_{sl}=0, \qquad B_s=0\\ \]
對於灰度多項式,也有
\[ f=polyfit(ln(G_{sl}),ln(G_{dl})) \]
且
\[ ln(C_{sl})=f(ln(C_s)), \qquad C_s>0\\ C_sl=0, \qquad C_s=0 \]