OpenCV
开源计算机视觉
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
颜色转换

参见 cv::cvtColorcv::ColorConversionCodes

待办事项
记录其他转换模式

RGB <-> 灰度

RGB空间内的转换,例如添加/移除alpha通道、反转通道顺序、转换为/从16位RGB颜色(R5:G6:B5或R5:G5:B5),以及使用以下公式进行灰度转换/从灰度转换

RGB[A] to Gray:Y0.299R+0.587G+0.114B

Gray to RGB[A]:RY,GY,BY,Amax(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

[XYZ][0.4124530.3575800.1804230.2126710.7151600.0721690.0193340.1191930.950227][RGB]

[RGB][3.2404791.537150.4985350.9692561.8759910.0415560.0556480.2040431.057311][XYZ]

XYZ覆盖整个值范围(对于浮点图像,Z可能超过1)。

另请参见
cv::COLOR_BGR2XYZcv::COLOR_RGB2XYZcv::COLOR_XYZ2BGRcv::COLOR_XYZ2RGB

RGB <-> YCrCb JPEG(或YCC)

Y0.299R+0.587G+0.114B

Cr(RY)0.713+delta

Cb(BY)0.564+delta

RY+1.403(Crdelta)

GY0.714(Crdelta)0.344(Cbdelta)

BY+1.773(Cbdelta)

其中

delta={128对于8位图像32768对于16位图像0.5对于浮点图像

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位。

R1.164(Y16)+1.596(V128)

G1.164(Y16)0.813(V128)0.391(U128)

B1.164(Y16)+2.018(U128)

Y(R0.299+G0.587+B0.114)23616256+16

U0.148Ravg0.291Gavg+0.439Bavg+128

V0.439Ravg0.368Gavg0.071Bavg+128

另请参见
cv::COLOR_YUV2RGB_NV12cv::COLOR_YUV2RGBA_YUY2cv::COLOR_BGR2YUV_YV12等等

RGB <-> HSV

对于8位和16位图像,R、G和B转换为浮点格式,并缩放以适应0到1的范围。

Vmax(R,G,B)

S{Vmin(R,G,B)Vif V00otherwise

H{60(GB)/(Vmin(R,G,B))if V=R120+60(BR)/(Vmin(R,G,B))if V=G240+60(RG)/(Vmin(R,G,B))if V=B0if R=G=B

如果H<0,则HH+360。输出时0V10S10H360

然后将值转换为目标数据类型

  • 8位图像:V255V,S255S,HH/2(以适应0到255)
  • 16位图像:(目前不支持)V65535V,S65535S,HH
  • 32位图像:H、S和V保持不变
另请参见
cv::COLOR_BGR2HSVcv::COLOR_RGB2HSVcv::COLOR_HSV2BGRcv::COLOR_HSV2RGB

RGB <-> HLS

对于8位和16位图像,R、G和B转换为浮点格式,并缩放以适应0到1的范围。

Vmaxmax(R,G,B)

Vminmin(R,G,B)

LVmax+Vmin2

S{VmaxVminVmax+Vmin如果 L<0.5 VmaxVmin2(Vmax+Vmin)如果 L0.5 

H{60(GB)/(VmaxVmin)如果 Vmax=R 120+60(BR)/(VmaxVmin)如果 Vmax=G 240+60(RG)/(VmaxVmin)如果 Vmax=B 0如果 R=G=B 

如果 H<0,则 HH+360 。输出结果为 0L10S10H360

然后将值转换为目标数据类型

  • 8位图像:V255V,S255S,HH/2(调整到0到255范围)
  • 16位图像:(目前不支持) V65535V,S65535S,HH
  • 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的范围。

[XYZ][0.4124530.3575800.1804230.2126710.7151600.0721690.0193340.1191930.950227][RGB]

XX/Xn,其中Xn=0.950456

ZZ/Zn,其中Zn=1.088754

L{116Y1/316对于 Y>0.008856903.3Y对于 Y0.008856

a500(f(X)f(Y))+delta

b200(f(Y)f(Z))+delta

其中

f(t)={t1/3对于 t>0.0088567.787t+16/116对于 t0.008856

delta={128对于8位图像0对于浮点数图像

输出结果为 0L100127a127127b127 。然后将这些值转换为目标数据类型。

  • 8位图像:LL255/100,aa+128,bb+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的范围。

[XYZ][0.4124530.3575800.1804230.2126710.7151600.0721690.0193340.1191930.950227][RGB]

L{116Y1/316对于 Y>0.008856903.3Y对于 Y0.008856

u4X/(X+15Y+3Z)

v9Y/(X+15Y+3Z)

u13L(uun)其中un=0.19793943

v13L(vvn)其中vn=0.46831096

输出结果为 0L100134u220140v122

然后将值转换为目标数据类型

  • 8位图像:L255/100L,u255/354(u+134),v255/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 C1C2 2BGR和CV_Bayer C1C2 2RGB中的两个字母C1C2表示特定的模式类型。这些是来自第二行、第二列和第三列的组件。例如,上述模式具有非常流行的“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