目录
1 图像的色彩空间介绍
在利用opencv库进行图像处理时,了解图像的色彩空间对于提取或者分割某种颜色的特征是非常有用的。在opencv中除了常见的RGB、GRAY等色彩空间以外,还有其他的色彩空间,比如YUV、HSV、Lab等。
2 图像的色彩空间详解
2.1 RGB色彩空间
RGB色彩空间表示红色(Red)、绿色(Green)、蓝色(Blue),根据每个分量上不同的数值组成。在opencv中的顺序正好是与其相反的,为BGR的形式。三个通道的对颜色的描述范围是一致的。例如在8UC3的图像中,每个分量的取值范围都是0-255,当都取为0,图像是全黑色,当都取255时,图像是全白色。
2.2 GRAY色彩空间
GRAY色彩空间是一个灰度的色彩空间,灰度图像只有单通道,在opencv中的很多图像处理过程中都会需要将彩色图像转换为灰度图像,这样更加有利于我们提取特征,RGB色彩空间与GRAY的灰度空间的转换公式为:
2.3 HSV色彩空间
HSV色彩空间表示色度(Hue)、饱和度(Saturation)、亮度(Value),根据每个分量上不同的数值组成。HSV色彩空间比起RGB色彩空间更加符合人类的感知。
2.4 YUV色彩空间
YUV色彩空间表示亮度(Y)、红色分量与亮度的差值(U)、蓝色分量与亮度的差值(V),根据每个分量上不同的数值组成。主要用于视频与图像的传输。
2.5 Lab色彩空间
Lab色彩空间表示亮度(Luminosity)、a、b是两个颜色通道,取值范围在-128-127之间,其中a表示由绿色变为红色的过程,b表示由蓝色变成黄色的过程。
3 图像的色彩空间转换API详解
在opencv中,封装了色彩空间转换的API函数cvtColor();
void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
InputArray src,输入图像:8位无符号、16位无符号(CV_16UC…)或单精度浮点;
OutputArray dst,输出图像;
int code,颜色空间转换代码,如下表所示,列举的一部分常用代号;
int dstCn-目的图像中的通道数;如果参数为0,则通道是从src和代码中自动推理出来的。一般情况下不用填写。
色彩空间转换 | 数字代号 |
COLOR_BGR2RGB | 4 |
COLOR_BGR2GRAY | 6 |
COLOR_RGB2GRAY | 7 |
COLOR_GRAY2BGR | 8 |
COLOR_BGR2HSV | 40 |
COLOR_RGB2HSV | 41 |
COLOR_BGR2Lab | 44 |
COLOR_RGB2Lab | 45 |
4 图像的色彩空间转换代码实现
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
//读取图像
Mat src = imread("G:\\image\\lena.png");
if (src.empty())
{
cout << "could not load image" << endl;
}
Mat gray, hsv, yuv, lab;
cvtColor(src, gray, COLOR_BGR2GRAY);
cvtColor(src, hsv, COLOR_BGR2HSV);
cvtColor(src, yuv, COLOR_BGR2YUV);
cvtColor(src, lab, COLOR_BGR2Lab);
//显示图像
imshow("RGB", src);
imshow("GRAY", gray);
imshow("HSV", hsv);
imshow("YUV", yuv);
imshow("Lab", lab);
//显示时间
waitKey(0);
return 0;
}