OpenCV颜色空间——HSV颜色空间

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wxcdzhangping/article/details/73699467

HSV颜色空间

HSV颜色空间和HLS颜色空间类似,这三个分量的数字化的取值范围一般为:

, ,


颜色模型如下:
调节S分量观察效果:

#include<opencv2/core.hpp>
#include<opencv2/imgproc.hpp>
#include<opencv2/highgui.hpp>
using namespace cv;
#include<string>
using namespace std;
//颜色显示
Mat colorMap;
//H的取值范围[0,360]
int H = 180;
int MAX_H = 360;
//S的取值范围[0,1]
int S = 0;
int MAX_S = 255;//可以自定义设定
//V的取值范围[0,1]
int V = 0;
int MAX_V = 255;
//颜色显示窗口
string showColor = "H-V";
//回调函数
void callback(int, void*);
int main(int argc, char*argv[])
{
	colorMap.create(Size(MAX_V + 1, MAX_H + 1), CV_32FC3);
	//命名窗口
	namedWindow(showColor, WINDOW_GUI_EXPANDED);
	//调节 V 分量
	createTrackbar("S分量", showColor, &S, MAX_V, callback);
	waitKey(0);
	return 0;
}
void callback(int, void*)
{
	for (int h = 0; h < MAX_H + 1; h++)
	{
		for (int v = 0; v < MAX_V + 1; v++)
		{
			colorMap.at<Vec3f>(h, v) = Vec3f(h, S / float(MAX_S), v / float(MAX_V));
		}
	}
	//颜色空间的转换
	cvtColor(colorMap, colorMap, COLOR_HSV2BGR);
	//显示颜色
	imshow(showColor, colorMap);
}
随着S分量的增加,颜色的饱和度也越来越明显,而在V很小时,S的影响会比较小

  

可以发现随着S分量的增加,颜色信息变得原来越明显

调节 V分量,观察其效果

#include<opencv2/core.hpp>
#include<opencv2/imgproc.hpp>
#include<opencv2/highgui.hpp>
using namespace cv;
#include<string>
using namespace std;
//颜色显示
Mat colorMap;
//H的取值范围[0,360]
int H = 180;
int MAX_H = 360;
//S的取值范围[0,1]
int S = 0;
int MAX_S = 255;//可以自定义设定
//V的取值范围[0,1]
int V = 0;
int MAX_V = 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("V分量", showColor, &V, MAX_V, 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<Vec3f>(h, s) = Vec3f(h, s/float(MAX_S), V/float(MAX_V));
		}
	}
	//颜色空间的转换
	cvtColor(colorMap, colorMap, COLOR_HSV2BGR);
	//显示颜色
	imshow(showColor, colorMap);
}

调节V分量,效果如下:

  

随着V分量的增加,颜色也原来越明显。

#include<opencv2/core.hpp>
#include<opencv2/imgproc.hpp>
#include<opencv2/highgui.hpp>
using namespace cv;
#include<string>
using namespace std;
//颜色显示
Mat colorMap;
//H的取值范围[0,360]
int H = 180;
int MAX_H = 360;
//S的取值范围[0,1]
int S = 0;
int MAX_S = 255;
//V的取值范围[0,1]
int V = 0;
int MAX_V = 255;//可以自定义设定
//颜色显示窗口
string showColor = "S-V";
//回调函数
void callback(int, void*);
int main(int argc, char*argv[])
{
	colorMap.create(Size(MAX_V + 1, MAX_S + 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 s = 0; s < MAX_S + 1; s++)
	{
		for (int v = 0; v < MAX_V + 1; v++)
		{
			colorMap.at<Vec3f>(s, v) = Vec3f(H, s / float(MAX_S), v / float(MAX_V));
		}
	}
	//颜色空间的转换
	cvtColor(colorMap, colorMap, COLOR_HSV2BGR);
	//显示颜色
	imshow(showColor, colorMap);
}

调节效果如下:

   

当v很小时,H的变换,颜色的变换也不明显。


猜你喜欢

转载自blog.csdn.net/wxcdzhangping/article/details/73699467