OpenCV 4.10.0
开源计算机视觉
|
请参见 cv::cvtColor 和 cv::ColorConversionCodes
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 图像转换为灰色
更高级的通道重新排序也可以使用 cv::mixChannels 来完成。
\[\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)。
\[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 覆盖整个值范围。
仅支持 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 \]
对于 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 位和 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 位和 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 位和 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\) 。
然后将这些值转换为目标数据类型
请注意,当将整型 Luv 图像转换为 RGB 时,中间的 X、Y 和 Z 值会被截断为 \( [0, 2] \) 范围以适应白点限制。这可能导致错误地表示具有奇异 XYZ 值的颜色。
用于将 RGB 转换为/从各种色彩空间进行转换的以上公式是从网络上的多个来源获取的,主要来自 Charles Poynton 网站 http://www.poynton.com/ColorFAQ.html
Bayer 模式在 CCD 和 CMOS 摄像机中被广泛使用。它能让你从单个平面上获得彩色图像,其中 R、G 和 B 像素(特定分量的传感器)会交替排列,如下所示
像素的输出 RGB 分量是从与像素具有相同颜色的 1 个、2 个或 4 个相邻像素插补得来的。
通过将图案向左和/或向上移动一个像素,可以实现上述图案的几个修改。转换常量 CV_Bayer 中的两个字母 \(C_1\) 和 \(C_2\) \(C_1 C_2\) 2BGR 和 CV_Bayer \(C_1 C_2\) 2RGB 表示特定的模式类型。这些分别是从第二行第二列和第三列来的分量。例如,上述图案有一种非常流行的“BG”类型。