OpenCV 4.12.0
開源計算機視覺
載入中...
搜尋中...
無匹配項
顏色轉換

請參見 cv::cvtColorcv::ColorConversionCodes

待辦
文件其他轉換模式

RGB <-> 灰度

RGB 空間內的變換,例如新增/刪除 Alpha 通道、反轉通道順序、轉換為/從 16 位 RGB 顏色(R5:G6:B5 或 R5:G5:B5)轉換,以及使用以下公式轉換為/從灰度轉換:

\[\text{RGB[A] to Gray:} \quad Y \leftarrow 0.299 \cdot R + 0.587 \cdot G + 0.114 \cdot B\]

\[\text{Gray to RGB[A]:} \quad R \leftarrow Y, G \leftarrow Y, B \leftarrow Y, A \leftarrow \max (ChannelRange)\]

從 RGB 影像轉換為灰度影像可以使用

cvtColor(src, bwsrc, cv::COLOR_RGB2GRAY);

更高階的通道重排也可以使用 cv::mixChannels 完成。

另請參見
cv::COLOR_BGR2GRAY, cv::COLOR_RGB2GRAY, cv::COLOR_GRAY2BGR, cv::COLOR_GRAY2RGB

RGB <-> CIE XYZ.Rec 709,使用 D65 白點

\[\begin{bmatrix} X \\ Y \\ Z \end{bmatrix} \leftarrow \begin{bmatrix} 0.412453 & 0.357580 & 0.180423 \\ 0.212671 & 0.715160 & 0.072169 \\ 0.019334 & 0.119193 & 0.950227 \end{bmatrix} \cdot \begin{bmatrix} R \\ G \\ B \end{bmatrix}\]

\[\begin{bmatrix} R \\ G \\ B \end{bmatrix} \leftarrow \begin{bmatrix} 3.240479 & -1.53715 & -0.498535 \\ -0.969256 & 1.875991 & 0.041556 \\ 0.055648 & -0.204043 & 1.057311 \end{bmatrix} \cdot \begin{bmatrix} X \\ Y \\ Z \end{bmatrix}\]

\(X\)、\(Y\) 和 \(Z\) 覆蓋整個值範圍(在浮點影像的情況下,\(Z\) 可能會超過 1)。

另請參見
cv::COLOR_BGR2XYZ, cv::COLOR_RGB2XYZ, cv::COLOR_XYZ2BGR, cv::COLOR_XYZ2RGB

RGB <-> YCrCb JPEG(或 YCC)

\[Y \leftarrow 0.299 \cdot R + 0.587 \cdot G + 0.114 \cdot B\]

\[Cr \leftarrow (R-Y) \cdot 0.713 + delta\]

\[Cb \leftarrow (B-Y) \cdot 0.564 + delta\]

\[R \leftarrow Y + 1.403 \cdot (Cr - delta)\]

\[G \leftarrow Y - 0.714 \cdot (Cr - delta) - 0.344 \cdot (Cb - delta)\]

\[B \leftarrow Y + 1.773 \cdot (Cb - delta)\]

其中

\[delta = \left \{ \begin{array}{l l} 128 & \mbox{對於 8 點陣圖像} \\ 32768 & \mbox{對於 16 點陣圖像} \\ 0.5 & \mbox{對於浮點影像} \end{array} \right .\]

Y、Cr 和 Cb 覆蓋整個值範圍。

另請參見
cv::COLOR_BGR2YCrCb, cv::COLOR_RGB2YCrCb, cv::COLOR_YCrCb2BGR, cv::COLOR_YCrCb2RGB

RGB <-> 使用子取樣的 YUV

僅支援 8 位值。 係數對應於 BT.601 標準,結果值 Y [16, 235],U 和 V [16, 240] 中心位於 128。

支援兩種子取樣方案:4:2:0(Fourcc 程式碼 NV12、NV21、YV12、I420 和同義詞)和 4:2:2(Fourcc 程式碼 UYVY、YUY2、YVYU 和同義詞)。

在這兩種子取樣方案中,Y 值都是為每個畫素寫入的,因此 Y 平面實際上是源影像的縮放和偏差的灰度版本。

在 4:2:0 方案中,U 和 V 值在 2x2 正方形上取平均值,即每個 4 個畫素僅儲存 1 個 U 值和 1 個 V 值。 U 和 V 值交錯儲存在一個單獨的平面 (NV12, NV21) 或兩個單獨的半平面 (YV12, I420) 中。

在 4:2:2 方案中,U 和 V 值在每對畫素上水平平均,即每個 2 個畫素僅儲存 1 個 U 值和 1 個 V 值。 U 和 V 值根據其 Fourcc 程式碼與兩個畫素的 Y 值交錯儲存。

請注意,出於速度或相容性的目的,不同的轉換以不同的精度執行。 例如,RGB 到 YUV 4:2:2 使用 14 位定點算術轉換,而其他轉換使用 20 位。

\[R \leftarrow 1.164 \cdot (Y - 16) + 1.596 \cdot (V - 128)\]

\[G \leftarrow 1.164 \cdot (Y - 16) - 0.813 \cdot (V - 128) - 0.391 \cdot (U - 128)\]

\[B \leftarrow 1.164 \cdot (Y - 16) + 2.018 \cdot (U - 128)\]

\[Y \leftarrow (R \cdot 0.299 + G \cdot 0.587 + B \cdot 0.114) \cdot \frac{236 - 16}{256} + 16 \]

\[U \leftarrow -0.148 \cdot R_{avg} - 0.291 \cdot G_{avg} + 0.439 \cdot B_{avg} + 128 \]

\[V \leftarrow 0.439 \cdot R_{avg} - 0.368 \cdot G_{avg} - 0.071 \cdot B_{avg} + 128 \]

另請參見
cv::COLOR_YUV2RGB_NV12, cv::COLOR_YUV2RGBA_YUY2, cv::COLOR_BGR2YUV_YV12 以及類似的顏色轉換

RGB <-> HSV

在 8 位和 16 點陣圖像的情況下,R、G 和 B 會被轉換為浮點格式,並縮放為適合 0 到 1 的範圍。

\[V \leftarrow max(R,G,B)\]

\[S \leftarrow \fork{\frac{V-min(R,G,B)}{V}}{if \(V \neq 0\)}{0}{otherwise}\]

\[H \leftarrow \forkfour{{60(G - B)}/{(V-min(R,G,B))}}{if \(V=R\)} {{120+60(B - R)}/{(V-min(R,G,B))}}{if \(V=G\)} {{240+60(R - G)}/{(V-min(R,G,B))}}{if \(V=B\)} {0}{if \(R=G=B\)}\]

如果 \(H<0\) 則 \(H \leftarrow H+360\) 。 在輸出中 \(0 \leq V \leq 1\),\(0 \leq S \leq 1\),\(0 \leq H \leq 360\) 。

然後將值轉換為目標資料型別

  • 8 點陣圖像:\(V \leftarrow 255 V, S \leftarrow 255 S, H \leftarrow H/2 \text{(適合 0 到 255)}\)
  • 16 點陣圖像:(當前不支援) \(V \leftarrow 65535 V, S \leftarrow 65535 S, H \leftarrow H\)
  • 32 點陣圖像:H、S 和 V 保持原樣
另請參見
cv::COLOR_BGR2HSV, cv::COLOR_RGB2HSV, cv::COLOR_HSV2BGR, cv::COLOR_HSV2RGB

RGB <-> HLS

在 8 位和 16 點陣圖像的情況下,R、G 和 B 會被轉換為浮點格式,並縮放為適合 0 到 1 的範圍。

\[V_{max} \leftarrow {max}(R,G,B)\]

\[V_{min} \leftarrow {min}(R,G,B)\]

\[L \leftarrow \frac{V_{max} + V_{min}}{2}\]

\[S \leftarrow \fork { \frac{V_{max} - V_{min}}{V_{max} + V_{min}} }{if \(L < 0.5\) } { \frac{V_{max} - V_{min}}{2 - (V_{max} + V_{min})} }{if \(L \ge 0.5\) }\]

\[H \leftarrow \forkfour {{60(G - B)}/{(V_{max}-V_{min})}}{if \(V_{max}=R\) } {{120+60(B - R)}/{(V_{max}-V_{min})}}{if \(V_{max}=G\) } {{240+60(R - G)}/{(V_{max}-V_{min})}}{if \(V_{max}=B\) } {0}{if \(R=G=B\) }\]

如果 \(H<0\) 則 \(H \leftarrow H+360\) 。 在輸出中 \(0 \leq L \leq 1\),\(0 \leq S \leq 1\),\(0 \leq H \leq 360\) 。

然後將值轉換為目標資料型別

  • 8 點陣圖像:\(V \leftarrow 255 \cdot V, S \leftarrow 255 \cdot S, H \leftarrow H/2 \; \text{(適合 0 到 255)}\)
  • 16 點陣圖像:(當前不支援) \(V \leftarrow 65535 \cdot V, S \leftarrow 65535 \cdot S, H \leftarrow H\)
  • 32 點陣圖像:H、S、V 保持原樣
另請參見
cv::COLOR_BGR2HLS, cv::COLOR_RGB2HLS, cv::COLOR_HLS2BGR, cv::COLOR_HLS2RGB

RGB <-> CIE L*a*b*

在 8 位和 16 點陣圖像的情況下,R、G 和 B 會被轉換為浮點格式,並縮放為適合 0 到 1 的範圍。

\[\vecthree{X}{Y}{Z} \leftarrow \vecthreethree{0.412453}{0.357580}{0.180423}{0.212671}{0.715160}{0.072169}{0.019334}{0.119193}{0.950227} \cdot \vecthree{R}{G}{B}\]

\[X \leftarrow X/X_n, \text{其中} X_n = 0.950456\]

\[Z \leftarrow Z/Z_n, \text{其中} Z_n = 1.088754\]

\[L \leftarrow \fork{116*Y^{1/3}-16}{for \(Y>0.008856\)}{903.3*Y}{for \(Y \le 0.008856\)}\]

\[a \leftarrow 500 (f(X)-f(Y)) + delta\]

\[b \leftarrow 200 (f(Y)-f(Z)) + delta\]

其中

\[f(t)= \fork{t^{1/3}}{for \(t>0.008856\)}{7.787 t+16/116}{for \(t\leq 0.008856\)}\]

\[delta = \fork{128}{for 8-bit images}{0}{for floating-point images}\]

這會輸出 \(0 \leq L \leq 100\),\(-127 \leq a \leq 127\),\(-127 \leq b \leq 127\) 。 然後將這些值轉換為目標資料型別

  • 8 點陣圖像:\(L \leftarrow L*255/100, \; a \leftarrow a + 128, \; b \leftarrow b + 128\)
  • 16 點陣圖像:(當前不支援)
  • 32 點陣圖像:L、a 和 b 保持原樣
另請參見
cv::COLOR_BGR2Lab, cv::COLOR_RGB2Lab, cv::COLOR_Lab2BGR, cv::COLOR_Lab2RGB

RGB <-> CIE L*u*v*

在 8 位和 16 點陣圖像的情況下,R、G 和 B 會被轉換為浮點格式,並縮放為適合 0 到 1 的範圍。

\[\vecthree{X}{Y}{Z} \leftarrow \vecthreethree{0.412453}{0.357580}{0.180423}{0.212671}{0.715160}{0.072169}{0.019334}{0.119193}{0.950227} \cdot \vecthree{R}{G}{B}\]

\[L \leftarrow \fork{116*Y^{1/3} - 16}{for \(Y>0.008856\)}{903.3 Y}{for \(Y\leq 0.008856\)}\]

\[u' \leftarrow 4*X/(X + 15*Y + 3 Z)\]

\[v' \leftarrow 9*Y/(X + 15*Y + 3 Z)\]

\[u \leftarrow 13*L*(u' - u_n) \quad \text{其中} \quad u_n=0.19793943\]

\[v \leftarrow 13*L*(v' - v_n) \quad \text{其中} \quad v_n=0.46831096\]

這會輸出 \(0 \leq L \leq 100\),\(-134 \leq u \leq 220\),\(-140 \leq v \leq 122\) 。

然後將值轉換為目標資料型別

  • 8 點陣圖像:\(L \leftarrow 255/100 L, \; u \leftarrow 255/354 (u + 134), \; v \leftarrow 255/262 (v + 140)\)
  • 16 點陣圖像:(當前不支援)
  • 32 點陣圖像:L、u 和 v 保持原樣

請注意,將整數 Luv 影像轉換為 RGB 時,中間的 X、Y 和 Z 值會截斷為 \( [0, 2] \) 範圍以適合白點限制。 這可能會導致具有奇數 XYZ 值的顏色表示不正確。

以上用於將 RGB 轉換為/從各種顏色空間的公式取自網路上的多個來源,主要來自 Charles Poynton 網站 http://www.poynton.com/ColorFAQ.html

另請參見
cv::COLOR_BGR2Luv, cv::COLOR_RGB2Luv, cv::COLOR_Luv2BGR, cv::COLOR_Luv2RGB

Bayer -> RGB

Bayer 模式廣泛用於 CCD 和 CMOS 相機。 它使您能夠從單個平面獲取彩色圖片,其中 R、G 和 B 畫素(特定分量的感測器)交錯排列,如下所示

Bayer 模式(BGGR、GBRG、GRBG、RGGB)

畫素的輸出 RGB 分量由具有相同顏色的畫素的 1 個、2 個或 4 個鄰居插值得到。

注意
有關 OpenCV Bayer 模式命名和經典 Bayer 模式命名之間對應關係的資訊,請參見以下內容。
Bayer 模式

透過將模式向左移動一個畫素和/或向上移動一個畫素,可以實現上述模式的幾種修改。 轉換常量 CV_Bayer \(C_1 C_2\) 2BGR 和 CV_Bayer \(C_1 C_2\) 2RGB 中的兩個字母 \(C_1\) 和 \(C_2\) 指示特定的模式型別。 這些分別是第二行、第二列和第三列的元件。 例如,上述模式具有非常流行的“BG”型別。

另請參見
cv::COLOR_BayerRGGB2BGR, cv::COLOR_BayerGRBG2BGR, cv::COLOR_BayerBGGR2BGR, cv::COLOR_BayerGBRG2BGR, cv::COLOR_BayerRGGB2RGB, cv::COLOR_BayerGRBG2RGB, cv::COLOR_BayerBGGR2RGB, cv::COLOR_BayerGBRG2RGB cv::COLOR_BayerBG2BGR, cv::COLOR_BayerGB2BGR, cv::COLOR_BayerRG2BGR, cv::COLOR_BayerGR2BGR, cv::COLOR_BayerBG2RGB, cv::COLOR_BayerGB2RGB, cv::COLOR_BayerRG2RGB, cv::COLOR_BayerGR2RGB