OpenCV颜色空间——HLS颜色空间

HLS颜色模型

HLS颜色空间,三个分量分别是色相(H)、亮度(L)、饱和度(S),这三个分量进行数字化处理,取值范围为:


模型可以通过以下两幅图像理解(来自维基百科)

OpenCV颜色空间——HLS颜色空间_第1张图片         OpenCV颜色空间——HLS颜色空间_第2张图片 

调节L分量,观察效果

从上图种可以看出,我们固定一个颜色(H),那么随着饱和度(S,Chroma)的增加,颜色越来越深,OpenCV通过定义函数cvtColor实现BGR颜色空间向HLS颜色空间的转换,使用该函数时,最好将输入图像的BGR值归一到[0,1]范围,可以通过调节亮度(L分量)观察L造成的影响:

#include
#include
#include
using namespace cv;
#include
using namespace std;
//颜色显示
Mat colorMap;
//H的取值范围[0,360]
int H = 180;
int MAX_H = 360;
//L的取值范围[0,1]
int L = 0;
int MAX_L = 255;//可以自定义设定
//S的取值范围[0,1]
int S = 0;
int MAX_S = 255;
//颜色显示窗口
string showColor = "H-S";
//回调函数
void callback(int, void*);
int main(int argc, char*argv[])
{
	colorMap.create(Size(MAX_S + 1, MAX_H + 1), CV_32FC3);
	//命名窗口
	namedWindow(showColor, WINDOW_GUI_EXPANDED);
	//调节 V 分量
	createTrackbar("L分量", showColor, &L, MAX_L, callback);
	waitKey(0);
	return 0;
}
void callback(int, void*)
{
	for (int h = 0; h < MAX_H + 1; h++)
	{
		for (int s = 0; s < MAX_S + 1; s++)
		{
			colorMap.at(h, s) = Vec3f(h, L / float(MAX_L), s / float(MAX_S));
		}
	}
	//颜色空间的转换
	cvtColor(colorMap, colorMap, COLOR_HLS2BGR);
	//显示颜色
	imshow(showColor, colorMap);
}

上述程序的运行界面如下,通过调节L分量,观察其效果:

OpenCV颜色空间——HLS颜色空间_第3张图片 OpenCV颜色空间——HLS颜色空间_第4张图片OpenCV颜色空间——HLS颜色空间_第5张图片

可以发现随着L的增大,所有的颜色逐渐消失,显示为白色,符合模型。

调节S分量观察其效果

#include
#include
#include
using namespace cv;
#include
using namespace std;
//颜色显示
Mat colorMap;
//H的取值范围[0,360]
int H = 180;
int MAX_H = 360;
//L的取值范围[0,1]
int L = 0;
int MAX_L = 255;//可以自定义设定
//S的取值范围[0,1]
int S = 0;
int MAX_S = 255;
//颜色显示窗口
string showColor = "H-L";
//回调函数
void callback(int, void*);
int main(int argc, char*argv[])
{
	colorMap.create(Size(MAX_L + 1, MAX_H + 1), CV_32FC3);
	//命名窗口
	namedWindow(showColor, WINDOW_GUI_EXPANDED);
	//调节 V 分量
	createTrackbar("S分量", showColor, &S, MAX_S, callback);
	waitKey(0);
	return 0;
}
void callback(int, void*)
{
	for (int h = 0; h < MAX_H + 1; h++)
	{
		for (int l = 0; l < MAX_L + 1; l++)
		{
			colorMap.at(h, l) = Vec3f(h, l / float(MAX_L), S / float(MAX_S));
		}
	}
	//颜色空间的转换
	cvtColor(colorMap, colorMap, COLOR_HLS2BGR);
	//显示颜色
	imshow(showColor, colorMap);
}


运行结果如下:

OpenCV颜色空间——HLS颜色空间_第6张图片 OpenCV颜色空间——HLS颜色空间_第7张图片 OpenCV颜色空间——HLS颜色空间_第8张图片

可以发现S很小时,几乎看不到颜色,随着S的增大,颜色信息也越来越明显。

通过上面显示的图谱可以看出,可以通过分割H分量,确定颜色。


调节H分量

#include
#include
#include
using namespace cv;
#include
using namespace std;
//颜色显示
Mat colorMap;
//H的取值范围[0,360]
int H = 180;
int MAX_H = 360;
//L的取值范围[0,1]
int L = 0;
int MAX_L = 255;//可以自定义设定
//S的取值范围[0,1]
int S = 0;
int MAX_S = 255;
//颜色显示窗口
string showColor = "L-S";
//回调函数
void callback(int, void*);
int main(int argc, char*argv[])
{
	colorMap.create(Size(MAX_S + 1, MAX_L + 1), CV_32FC3);
	//命名窗口
	namedWindow(showColor, WINDOW_GUI_EXPANDED);
	//调节 H 分量
	createTrackbar("H分量", showColor, &H, MAX_H, callback);
	callback(0, 0);
	waitKey(0);
	return 0;
}
void callback(int, void*)
{
	for (int l = 0; l < MAX_L + 1; l++)
	{
		for (int s = 0; s < MAX_S + 1; s++)
		{
			colorMap.at(l, s) = Vec3f(H, l / float(MAX_L), s / float(MAX_S));
		}
	}
	//颜色空间的转换
	cvtColor(colorMap, colorMap, COLOR_HLS2BGR);
	//显示颜色
	imshow(showColor, colorMap);
}
效果如下:
OpenCV颜色空间——HLS颜色空间_第9张图片  OpenCV颜色空间——HLS颜色空间_第10张图片  OpenCV颜色空间——HLS颜色空间_第11张图片
观察到L很大或者很小时,H的变换颜色值的变化非常小



你可能感兴趣的:(图像处理,OpenCV,Python,计算机视觉,HLS颜色空间,色相,饱和度,亮度,opencv)