opencv 提供了cvtColor()函数,用于在图像中不同的色彩空间进行转换,用于后续处理。在使用cvtColor之前首先需要了解下基本的图像色彩模式,色彩模式决定了打印或显示的图片颜色。
位图模式是图像中最基本的格式,图像只有黑色和白色像素,是色彩模式中占有空间最小的,同样也叫做黑白图,它包含的信息量最少,无法包含图像中的细节,相当于只有0或者1
注意使用cvtColor RGB转成其他格式时,需要注意RGB图像的三个通道的顺序,是RGB还是BGR.大部分情况下opencv为RGB,但实际上是BGR,这一点需要注意。
在线性转换时,其范围没有较大关系,但是如果是非线性转换,RGB图像需要做正确的归一化,以扩展到响应的范围。例如TGB->L*U*V转换,如果32位的浮点图像之间是由8位的图像转换而来,那么将0到255的范围转换成0,1,那么转换之前首先需要需要所需其图像
1 enum cv::ColorConversionCodes {
2 cv::COLOR_BGR2BGRA = 0,
3 cv::COLOR_RGB2RGBA = COLOR_BGR2BGRA,
4 cv::COLOR_BGRA2BGR = 1,
5 cv::COLOR_RGBA2RGB = COLOR_BGRA2BGR,
6 cv::COLOR_BGR2RGBA = 2,
7 cv::COLOR_RGB2BGRA = COLOR_BGR2RGBA,
8 cv::COLOR_RGBA2BGR = 3,
9 cv::COLOR_BGRA2RGB = COLOR_RGBA2BGR,
10 cv::COLOR_BGR2RGB = 4,
11 cv::COLOR_RGB2BGR = COLOR_BGR2RGB,
12 cv::COLOR_BGRA2RGBA = 5,
13 cv::COLOR_RGBA2BGRA = COLOR_BGRA2RGBA,
14 cv::COLOR_BGR2GRAY = 6,
15 cv::COLOR_RGB2GRAY = 7,
16 cv::COLOR_GRAY2BGR = 8,
17 cv::COLOR_GRAY2RGB = COLOR_GRAY2BGR,
18 cv::COLOR_GRAY2BGRA = 9,
19 cv::COLOR_GRAY2RGBA = COLOR_GRAY2BGRA,
20 cv::COLOR_BGRA2GRAY = 10,
21 cv::COLOR_RGBA2GRAY = 11,
22 cv::COLOR_BGR2BGR565 = 12,
23 cv::COLOR_RGB2BGR565 = 13,
24 cv::COLOR_BGR5652BGR = 14,
25 cv::COLOR_BGR5652RGB = 15,
26 cv::COLOR_BGRA2BGR565 = 16,
27 cv::COLOR_RGBA2BGR565 = 17,
28 cv::COLOR_BGR5652BGRA = 18,
29 cv::COLOR_BGR5652RGBA = 19,
30 cv::COLOR_GRAY2BGR565 = 20,
31 cv::COLOR_BGR5652GRAY = 21,
32 cv::COLOR_BGR2BGR555 = 22,
33 cv::COLOR_RGB2BGR555 = 23,
34 cv::COLOR_BGR5552BGR = 24,
35 cv::COLOR_BGR5552RGB = 25,
36 cv::COLOR_BGRA2BGR555 = 26,
37 cv::COLOR_RGBA2BGR555 = 27,
38 cv::COLOR_BGR5552BGRA = 28,
39 cv::COLOR_BGR5552RGBA = 29,
40 cv::COLOR_GRAY2BGR555 = 30,
41 cv::COLOR_BGR5552GRAY = 31,
42 cv::COLOR_BGR2XYZ = 32,
43 cv::COLOR_RGB2XYZ = 33,
44 cv::COLOR_XYZ2BGR = 34,
45 cv::COLOR_XYZ2RGB = 35,
46 cv::COLOR_BGR2YCrCb = 36,
47 cv::COLOR_RGB2YCrCb = 37,
48 cv::COLOR_YCrCb2BGR = 38,
49 cv::COLOR_YCrCb2RGB = 39,
50 cv::COLOR_BGR2HSV = 40,
51 cv::COLOR_RGB2HSV = 41,
52 cv::COLOR_BGR2Lab = 44,
53 cv::COLOR_RGB2Lab = 45,
54 cv::COLOR_BGR2Luv = 50,
55 cv::COLOR_RGB2Luv = 51,
56 cv::COLOR_BGR2HLS = 52,
57 cv::COLOR_RGB2HLS = 53,
58 cv::COLOR_HSV2BGR = 54,
59 cv::COLOR_HSV2RGB = 55,
60 cv::COLOR_Lab2BGR = 56,
61 cv::COLOR_Lab2RGB = 57,
62 cv::COLOR_Luv2BGR = 58,
63 cv::COLOR_Luv2RGB = 59,
64 cv::COLOR_HLS2BGR = 60,
65 cv::COLOR_HLS2RGB = 61,
66 cv::COLOR_BGR2HSV_FULL = 66,
67 cv::COLOR_RGB2HSV_FULL = 67,
68 cv::COLOR_BGR2HLS_FULL = 68,
69 cv::COLOR_RGB2HLS_FULL = 69,
70 cv::COLOR_HSV2BGR_FULL = 70,
71 cv::COLOR_HSV2RGB_FULL = 71,
72 cv::COLOR_HLS2BGR_FULL = 72,
73 cv::COLOR_HLS2RGB_FULL = 73,
74 cv::COLOR_LBGR2Lab = 74,
75 cv::COLOR_LRGB2Lab = 75,
76 cv::COLOR_LBGR2Luv = 76,
77 cv::COLOR_LRGB2Luv = 77,
78 cv::COLOR_Lab2LBGR = 78,
79 cv::COLOR_Lab2LRGB = 79,
80 cv::COLOR_Luv2LBGR = 80,
81 cv::COLOR_Luv2LRGB = 81,
82 cv::COLOR_BGR2YUV = 82,
83 cv::COLOR_RGB2YUV = 83,
84 cv::COLOR_YUV2BGR = 84,
85 cv::COLOR_YUV2RGB = 85,
86 cv::COLOR_YUV2RGB_NV12 = 90,
87 cv::COLOR_YUV2BGR_NV12 = 91,
88 cv::COLOR_YUV2RGB_NV21 = 92,
89 cv::COLOR_YUV2BGR_NV21 = 93,
90 cv::COLOR_YUV420sp2RGB = COLOR_YUV2RGB_NV21,
91 cv::COLOR_YUV420sp2BGR = COLOR_YUV2BGR_NV21,
92 cv::COLOR_YUV2RGBA_NV12 = 94,
93 cv::COLOR_YUV2BGRA_NV12 = 95,
94 cv::COLOR_YUV2RGBA_NV21 = 96,
95 cv::COLOR_YUV2BGRA_NV21 = 97,
96 cv::COLOR_YUV420sp2RGBA = COLOR_YUV2RGBA_NV21,
97 cv::COLOR_YUV420sp2BGRA = COLOR_YUV2BGRA_NV21,
98 cv::COLOR_YUV2RGB_YV12 = 98,
99 cv::COLOR_YUV2BGR_YV12 = 99,
100 cv::COLOR_YUV2RGB_IYUV = 100,
101 cv::COLOR_YUV2BGR_IYUV = 101,
102 cv::COLOR_YUV2RGB_I420 = COLOR_YUV2RGB_IYUV,
103 cv::COLOR_YUV2BGR_I420 = COLOR_YUV2BGR_IYUV,
104 cv::COLOR_YUV420p2RGB = COLOR_YUV2RGB_YV12,
105 cv::COLOR_YUV420p2BGR = COLOR_YUV2BGR_YV12,
106 cv::COLOR_YUV2RGBA_YV12 = 102,
107 cv::COLOR_YUV2BGRA_YV12 = 103,
108 cv::COLOR_YUV2RGBA_IYUV = 104,
109 cv::COLOR_YUV2BGRA_IYUV = 105,
110 cv::COLOR_YUV2RGBA_I420 = COLOR_YUV2RGBA_IYUV,
111 cv::COLOR_YUV2BGRA_I420 = COLOR_YUV2BGRA_IYUV,
112 cv::COLOR_YUV420p2RGBA = COLOR_YUV2RGBA_YV12,
113 cv::COLOR_YUV420p2BGRA = COLOR_YUV2BGRA_YV12,
114 cv::COLOR_YUV2GRAY_420 = 106,
115 cv::COLOR_YUV2GRAY_NV21 = COLOR_YUV2GRAY_420,
116 cv::COLOR_YUV2GRAY_NV12 = COLOR_YUV2GRAY_420,
117 cv::COLOR_YUV2GRAY_YV12 = COLOR_YUV2GRAY_420,
118 cv::COLOR_YUV2GRAY_IYUV = COLOR_YUV2GRAY_420,
119 cv::COLOR_YUV2GRAY_I420 = COLOR_YUV2GRAY_420,
120 cv::COLOR_YUV420sp2GRAY = COLOR_YUV2GRAY_420,
121 cv::COLOR_YUV420p2GRAY = COLOR_YUV2GRAY_420,
122 cv::COLOR_YUV2RGB_UYVY = 107,
123 cv::COLOR_YUV2BGR_UYVY = 108,
124 cv::COLOR_YUV2RGB_Y422 = COLOR_YUV2RGB_UYVY,
125 cv::COLOR_YUV2BGR_Y422 = COLOR_YUV2BGR_UYVY,
126 cv::COLOR_YUV2RGB_UYNV = COLOR_YUV2RGB_UYVY,
127 cv::COLOR_YUV2BGR_UYNV = COLOR_YUV2BGR_UYVY,
128 cv::COLOR_YUV2RGBA_UYVY = 111,
129 cv::COLOR_YUV2BGRA_UYVY = 112,
130 cv::COLOR_YUV2RGBA_Y422 = COLOR_YUV2RGBA_UYVY,
131 cv::COLOR_YUV2BGRA_Y422 = COLOR_YUV2BGRA_UYVY,
132 cv::COLOR_YUV2RGBA_UYNV = COLOR_YUV2RGBA_UYVY,
133 cv::COLOR_YUV2BGRA_UYNV = COLOR_YUV2BGRA_UYVY,
134 cv::COLOR_YUV2RGB_YUY2 = 115,
135 cv::COLOR_YUV2BGR_YUY2 = 116,
136 cv::COLOR_YUV2RGB_YVYU = 117,
137 cv::COLOR_YUV2BGR_YVYU = 118,
138 cv::COLOR_YUV2RGB_YUYV = COLOR_YUV2RGB_YUY2,
139 cv::COLOR_YUV2BGR_YUYV = COLOR_YUV2BGR_YUY2,
140 cv::COLOR_YUV2RGB_YUNV = COLOR_YUV2RGB_YUY2,
141 cv::COLOR_YUV2BGR_YUNV = COLOR_YUV2BGR_YUY2,
142 cv::COLOR_YUV2RGBA_YUY2 = 119,
143 cv::COLOR_YUV2BGRA_YUY2 = 120,
144 cv::COLOR_YUV2RGBA_YVYU = 121,
145 cv::COLOR_YUV2BGRA_YVYU = 122,
146 cv::COLOR_YUV2RGBA_YUYV = COLOR_YUV2RGBA_YUY2,
147 cv::COLOR_YUV2BGRA_YUYV = COLOR_YUV2BGRA_YUY2,
148 cv::COLOR_YUV2RGBA_YUNV = COLOR_YUV2RGBA_YUY2,
149 cv::COLOR_YUV2BGRA_YUNV = COLOR_YUV2BGRA_YUY2,
150 cv::COLOR_YUV2GRAY_UYVY = 123,
151 cv::COLOR_YUV2GRAY_YUY2 = 124,
152 cv::COLOR_YUV2GRAY_Y422 = COLOR_YUV2GRAY_UYVY,
153 cv::COLOR_YUV2GRAY_UYNV = COLOR_YUV2GRAY_UYVY,
154 cv::COLOR_YUV2GRAY_YVYU = COLOR_YUV2GRAY_YUY2,
155 cv::COLOR_YUV2GRAY_YUYV = COLOR_YUV2GRAY_YUY2,
156 cv::COLOR_YUV2GRAY_YUNV = COLOR_YUV2GRAY_YUY2,
157 cv::COLOR_RGBA2mRGBA = 125,
158 cv::COLOR_mRGBA2RGBA = 126,
159 cv::COLOR_RGB2YUV_I420 = 127,
160 cv::COLOR_BGR2YUV_I420 = 128,
161 cv::COLOR_RGB2YUV_IYUV = COLOR_RGB2YUV_I420,
162 cv::COLOR_BGR2YUV_IYUV = COLOR_BGR2YUV_I420,
163 cv::COLOR_RGBA2YUV_I420 = 129,
164 cv::COLOR_BGRA2YUV_I420 = 130,
165 cv::COLOR_RGBA2YUV_IYUV = COLOR_RGBA2YUV_I420,
166 cv::COLOR_BGRA2YUV_IYUV = COLOR_BGRA2YUV_I420,
167 cv::COLOR_RGB2YUV_YV12 = 131,
168 cv::COLOR_BGR2YUV_YV12 = 132,
169 cv::COLOR_RGBA2YUV_YV12 = 133,
170 cv::COLOR_BGRA2YUV_YV12 = 134,
171 cv::COLOR_BayerBG2BGR = 46,
172 cv::COLOR_BayerGB2BGR = 47,
173 cv::COLOR_BayerRG2BGR = 48,
174 cv::COLOR_BayerGR2BGR = 49,
175 cv::COLOR_BayerBG2RGB = COLOR_BayerRG2BGR,
176 cv::COLOR_BayerGB2RGB = COLOR_BayerGR2BGR,
177 cv::COLOR_BayerRG2RGB = COLOR_BayerBG2BGR,
178 cv::COLOR_BayerGR2RGB = COLOR_BayerGB2BGR,
179 cv::COLOR_BayerBG2GRAY = 86,
180 cv::COLOR_BayerGB2GRAY = 87,
181 cv::COLOR_BayerRG2GRAY = 88,
182 cv::COLOR_BayerGR2GRAY = 89,
183 cv::COLOR_BayerBG2BGR_VNG = 62,
184 cv::COLOR_BayerGB2BGR_VNG = 63,
185 cv::COLOR_BayerRG2BGR_VNG = 64,
186 cv::COLOR_BayerGR2BGR_VNG = 65,
187 cv::COLOR_BayerBG2RGB_VNG = COLOR_BayerRG2BGR_VNG,
188 cv::COLOR_BayerGB2RGB_VNG = COLOR_BayerGR2BGR_VNG,
189 cv::COLOR_BayerRG2RGB_VNG = COLOR_BayerBG2BGR_VNG,
190 cv::COLOR_BayerGR2RGB_VNG = COLOR_BayerGB2BGR_VNG,
191 cv::COLOR_BayerBG2BGR_EA = 135,
192 cv::COLOR_BayerGB2BGR_EA = 136,
193 cv::COLOR_BayerRG2BGR_EA = 137,
194 cv::COLOR_BayerGR2BGR_EA = 138,
195 cv::COLOR_BayerBG2RGB_EA = COLOR_BayerRG2BGR_EA,
196 cv::COLOR_BayerGB2RGB_EA = COLOR_BayerGR2BGR_EA,
197 cv::COLOR_BayerRG2RGB_EA = COLOR_BayerBG2BGR_EA,
198 cv::COLOR_BayerGR2RGB_EA = COLOR_BayerGB2BGR_EA,
199 cv::COLOR_BayerBG2BGRA = 139,
200 cv::COLOR_BayerGB2BGRA = 140,
201 cv::COLOR_BayerRG2BGRA = 141,
202 cv::COLOR_BayerGR2BGRA = 142,
203 cv::COLOR_BayerBG2RGBA = COLOR_BayerRG2BGRA,
204 cv::COLOR_BayerGB2RGBA = COLOR_BayerGR2BGRA,
205 cv::COLOR_BayerRG2RGBA = COLOR_BayerBG2BGRA,
206 cv::COLOR_BayerGR2RGBA = COLOR_BayerGB2BGRA,
207 cv::COLOR_COLORCVT_MAX = 143
208 }
opencv函数cvCvtColor(rgb_im,hsv_im,CV_BGR2HSV)中使用的RGB颜色空间转到HSV算法:
max=max(R,G,B)
min=min(R,G,B)
if R = max, H = (G-B)/(max-min)
if G = max, H = 2 + (B-R)/(max-min)
if B = max, H = 4 + (R-G)/(max-min)
H = H * 60
if H < 0, H = H + 360
V=max(R,G,B)
S=(V-min)/V,ifV=0,S=0,(对于8bit虽然帮助文档上如是写S=(V-min)*255/V,但实测S:0~1)
因此,对于8bit图像可直接输入,根据该算法所得结果中:范围H:0~360,S:0~1,V:0~255,
图像精度转换cvConvertScale()
通常我们获取的图像深的为IPL_DEPTH_8U,而上述hsv_im已超出该范围。因此我们定义hsv_im的深度为IPL_DEPTH_32F,而源图像为IPL_DEPTH_8U,如果直接调用函数cvCvtColor会出项输入不匹配的错处,因此要将源图像转换到IPL_DEPTH_32F深度,并归一化像素值。这一步使用cvConvertScale(hsv_im,hsv_im_float,1/255),然后调用cvCvtColor(hsv_im_float,hsv_im,CV_BGR2HSV)即可得到正确的HSV值,但HSV值与matlab有一定误差,原因不明。
cvtColor(temp,tempGray,CV_BGR2GRAY);