0%

OpenCV颜色空间转换

这里简单介绍一下OpenCV中的颜色空间的转换。我在日常主要用到RGB, GRAY, Lab, Luv这四个颜色空间。我主要介绍一下RGB到Lab和Luv颜色空间的转换。

具体的转换公式可以查看OpenCV官方网站 的描述。这里主要是简单的代码示例。

RGB to Lab

Lab颜色空间中,各个分量的取值范围为:$0 \leq L \leq 100, -127 \leq a,b \leq 127 $​​​​。如果原始的图像是8比特的图像,OpenCV会对其做出一定的转换,使其能够在8-bit的uchar类型中存放。其转换规则为:$L=L*255/100, a=a+128, b=b+128$​,而如果原始图像为16-bit,这不支持从RGB到Lab颜色空间的转换。如果原始图像为32-bit,则不会做出上述转换。所以,如果我们需要正常取值范围,则需要按照下面的方式来写颜色转换代码:

1
2
3
4
5
6
string image_path = R"(D:\code\image\1_0.tif)";
Mat image = imread(image_path);// image的类型为CV_8UC3
image.convertTo(image, CV_32FC3);
image /= 255.f; //归一化
Mat lab_image(image.size(), CV_32FC3);
cvtColor(image, lab_image, COLOR_BGR2Lab);//lab_image中各个像素的取值是没有做映射的

RGB to Luv

在Luv颜色空间中,各个分量的取值范围为:$0 \leq L \leq 100, -134 \leq u \leq 220, -140 \leq v \leq 122$​​​。同样的,其处理和上面的类似,对于8-bit图片,会做如下映射:$L=255/100L, u=255/354(u+134), v=255/262(v+140) $。16-bit图片的转换不支持,32-bit的图片则不会做出上述映射。

1
2
3
4
5
6
string image_path = R"(D:\code\image\1_0.tif)";
Mat image = imread(image_path);
image.convertTo(image, CV_32FC3);
image /= 255.f; //归一化
Mat luv_image;
cvtColor(image, luv_image, COLOR_BGR2Luv);

注意:因为上面在转化的时候进行了归一化,所以如果我们将32bit的Luv转为RGB后,其范围也是[0,1]