OpenCV颜色空间——Luv颜色空间

Luv颜色空间,三个值的取值范围:

调节L分量:

#include<opencv2/core.hpp>
#include<opencv2/imgproc.hpp>
#include<opencv2/highgui.hpp>
using namespace cv;
#include<string>
#include<iostream>
using namespace std;
//显示Lab颜色的色卡
Mat colorMap;
//L的取值范围 [0,100]
int L = 50;
int MAX_L = 100;
//u的取值范围[-134,220]
int MAX_u = 354;
//v的取值范围[-140,122]
int MAX_v = 262;
//颜色显示窗口
string showColor = "Luv";
//回调函数
void callback(int, void*);
int main(int argc, char*argv[])
{
	//分配内存
	colorMap.create(Size(MAX_u+1, MAX_v+1), CV_32FC3);
	//命名窗口
	namedWindow(showColor, WINDOW_GUI_EXPANDED);
	//调节 L 分量
	createTrackbar("L分量", showColor, &L, MAX_L, callback);
	callback(0, 0);
	waitKey(0);
	return 0;
}
void callback(int, void*)
{
	
	//MAX_u x MAX_v种颜色
	for (int v = 0; v < MAX_v+1; v++)
	{
		for (int u = 0; u < MAX_u+1; u++)
		{
			colorMap.at<Vec3f>(v, u) = Vec3f(L,u-134,v-140);
		}
	}
	//颜色空间转换
	cvtColor(colorMap, colorMap,COLOR_Luv2BGR);
	//显示颜色空间
	imshow(showColor, colorMap);
}

效果如下:

  

#include<opencv2/core.hpp>
#include<opencv2/imgproc.hpp>
#include<opencv2/highgui.hpp>
using namespace cv;
#include<string>
#include<iostream>
using namespace std;
//显示颜色
Mat colorMap;
//L的取值范围 [0,100]
int L = 0;
int MAX_L = 100;
//u的取值范围[-134,220]
int u = 0;
int MAX_u = 354;//220+134
//v的取值范围[-140,122]
int v = 0;
int MAX_v = 262;//140+122
//颜色显示窗口
string showColor = "Luv";
//回调函数
void callback(int, void*);
int main(int argc, char*argv[])
{
	//分配内存
	colorMap.create(Size(500, 500), CV_32FC3);
	//命名窗口
	namedWindow(showColor, WINDOW_GUI_EXPANDED);
	//调节 L 分量
	createTrackbar("L分量", showColor, &L, MAX_L, callback);
	//调节 u 分量
	createTrackbar("u分量", showColor, &u, MAX_u, callback);
	//调节 v 分量
	createTrackbar("v分量", showColor, &v, MAX_v, callback);
	callback(0, 0);
	waitKey(0);
	return 0;
}
void callback(int, void*)
{
	//Lab颜色
	colorMap.setTo(Vec3f(L, u-134, v-140));
	//颜色空间转换
	cvtColor(colorMap, colorMap, COLOR_Lab2BGR);
	//显示颜色空间
	imshow(showColor, colorMap);
}

通过调节三个分量 L,u,v分量,观察颜色的变换:

#include<opencv2/core.hpp>
#include<opencv2/imgproc.hpp>
#include<opencv2/highgui.hpp>
using namespace cv;
#include<string>
#include<iostream>
using namespace std;
//显示颜色
Mat colorMap;
//L的取值范围 [0,100]
int L = 0;
int MAX_L = 100;
//u的取值范围[-134,220]
int u = 0;
int MAX_u = 354;//220+134
//v的取值范围[-140,122]
int v = 0;
int MAX_v = 262;//140+122
//颜色显示窗口
string showColor = "Luv";
//回调函数
void callback(int, void*);
int main(int argc, char*argv[])
{
	//分配内存
	colorMap.create(Size(500, 500), CV_32FC3);
	//命名窗口
	namedWindow(showColor, WINDOW_GUI_EXPANDED);
	//调节 L 分量
	createTrackbar("L分量", showColor, &L, MAX_L, callback);
	//调节 u 分量
	createTrackbar("u分量", showColor, &u, MAX_u, callback);
	//调节 v 分量
	createTrackbar("v分量", showColor, &v, MAX_v, callback);
	callback(0, 0);
	waitKey(0);
	return 0;
}
void callback(int, void*)
{
	//Lab颜色
	colorMap.setTo(Vec3f(L, u-134, v-140));
	//颜色空间转换
	cvtColor(colorMap, colorMap, COLOR_Lab2BGR);
	//显示颜色空间
	imshow(showColor, colorMap);
}

结果如下:


  

通过三个分量查看对应的颜色。


注意如果采用的CV_8UC3的BGR图像直接转换为Luv空间时,Luv的三个分量的值也会被换算成[0,255],避免负值的存在,这样就可以分别显示三个通道了:

#include<opencv2/core.hpp>
#include<opencv2/imgproc.hpp>
#include<opencv2/highgui.hpp>
using namespace cv;
#include<iostream>
using namespace std;
int main(int argc, char*argv[])
{
	//输入图像
	Mat bgr = imread(argv[1], IMREAD_ANYCOLOR);
	if (!bgr.data || bgr.channels() != 3)
		return -1;
	//颜色空间转换
	Mat Luv;
	cvtColor(bgr, Luv, COLOR_BGR2Luv);
	/*------分离通道--------*/
	vector<Mat> LuvPlane;
	split(Luv, LuvPlane);
	/*----显示Luv三个通道-----*/
	imshow("Luv-L", LuvPlane[0]);
	imshow("Luv-u", LuvPlane[1]);
	imshow("Luv-v", LuvPlane[2]);
	waitKey(0);
	return 0;
}

结果如下:

   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值