OpenCV 4.11.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_BGR2GRAYcv::COLOR_RGB2GRAYcv::COLOR_GRAY2BGRcv::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_BGR2XYZcv::COLOR_RGB2XYZcv::COLOR_XYZ2BGRcv::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_BGR2YCrCbcv::COLOR_RGB2YCrCbcv::COLOR_YCrCb2BGRcv::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值。根据其Fourcc代码,U和V值与两个像素的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_NV12cv::COLOR_YUV2RGBA_YUY2cv::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_BGR2HSVcv::COLOR_RGB2HSVcv::COLOR_HSV2BGRcv::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}} }{如果 \(L < 0.5\) } { \frac{V_{max} - V_{min}}{2 - (V_{max} + V_{min})} }{如果 \(L \ge 0.5\) }\]

\[H \leftarrow \forkfour {{60(G - B)}/{(V_{max}-V_{min})}}{如果 \(V_{max}=R\) } {{120+60(B - R)}/{(V_{max}-V_{min})}}{如果 \(V_{max}=G\) } {{240+60(R - G)}/{(V_{max}-V_{min})}}{如果 \(V_{max}=B\) } {0}{如果 \(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_BGR2HLScv::COLOR_RGB2HLScv::COLOR_HLS2BGRcv::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}{对于 \(Y>0.008856\)}{903.3*Y}{对于 \(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}}{对于 \(t>0.008856\)}{7.787 t+16/116}{对于 \(t\leq 0.008856\)}\]

\[delta = \fork{128}{对于8位图像}{0}{对于浮点数图像}\]

输出结果为 \(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_BGR2Labcv::COLOR_RGB2Labcv::COLOR_Lab2BGRcv::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}{对于 \(Y>0.008856\)}{903.3 Y}{对于 \(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_BGR2Luvcv::COLOR_RGB2Luvcv::COLOR_Luv2BGRcv::COLOR_Luv2RGB

Bayer -> RGB

拜耳模式广泛用于CCD和CMOS相机。它使您可以从单个平面获得彩色图像,其中R、G和B像素(特定组件的传感器)交错排列如下:

拜耳模式(BGGR、GBRG、GRGB、RGGB)

像素的输出RGB分量通过对具有相同颜色的像素的1、2或4个相邻像素进行插值获得。

注意
有关OpenCV拜耳模式命名与经典拜耳模式命名之间对应关系的信息,请参见以下内容。
拜耳模式

上述模式有几种修改方法,可以通过将模式向左移动一个像素和/或向上移动一个像素来实现。转换常量CV_Bayer \(C_1 C_2\) 2BGR和CV_Bayer \(C_1 C_2\) 2RGB中的两个字母\(C_1\)和\(C_2\)表示特定的模式类型。这些是来自第二行、第二列和第三列的组件。例如,上述模式具有非常流行的“BG”类型。

另请参见
cv::COLOR_BayerRGGB2BGRcv::COLOR_BayerGRBG2BGRcv::COLOR_BayerBGGR2BGRcv::COLOR_BayerGBRG2BGRcv::COLOR_BayerRGGB2RGBcv::COLOR_BayerGRBG2RGBcv::COLOR_BayerBGGR2RGBcv::COLOR_BayerGBRG2RGB cv::COLOR_BayerBG2BGRcv::COLOR_BayerGB2BGRcv::COLOR_BayerRG2BGRcv::COLOR_BayerGR2BGRcv::COLOR_BayerBG2RGBcv::COLOR_BayerGB2RGBcv::COLOR_BayerRG2RGBcv::COLOR_BayerGR2RGB