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;
}
结果如下: