opencv中的显示查找表LUT代码详解

LUT()函数原型

void cv::LUT(InputArray src,InputArray lut,OutputArray dst)
src: 输入图像矩阵,数据类型只能是CV_8U
lut: 256个像素灰度值的查找表,单通道或者与src通道数相同
dst: 输出图像矩阵,尺寸与src相同,数据类型与lut相同

uchar lutFirst[256];
	for (int i = 0; i < 256; i++)
	{
		if (i <= 100)
			lutFirst[i] = 0;
		if (i > 100 && i <= 200)
			lutFirst[i] = 100;
		if (i > 200)
			lutFirst[i] = 255;
	}
	Mat lutOne(1, 256, CV_8UC1, lutFirst);

这是第一层的LUT , 可以根据要求改变参数,Mat类中lutOne是一个一行256列的数组,其中0到100列中对应的是0,101列到200列对应的是100,201列到255列对应的是255

然后读入一个图片Mat img = imread(“lena.jpg”);
LUT(img,lutOne,Mat::out)此函数img就是对应查找表lutOne得出out,img的BGR三个通道像素在0到100的,在out中得出的是0,101到200—>100, 201到255->255
可以在Image Watch中查看

下同

LUT的第二层和第三层代码

uchar lutSecond[256];
	for (int i = 0; i < 256; i++) {
		if (i <= 100) lutSecond[i] = 0;
		if (i > 100 && i <= 150) lutSecond[i] = 100;
		if (i > 150 && i <= 200) lutSecond[i] = 150;
		if (i > 200) lutSecond[i] = 255;
	}
	Mat lutTwo(1, 256, CV_8UC1, lutSecond);
uchar lutThird[256];
	for (int i = 0; i < 256; i++) {
		if (i <= 100) lutThird[i] = 100;
		if (i > 100 && i <= 200) lutThird[i] = 200;
		if (i > 200) lutThird[i] = 255;
	}
	Mat lutThree(1, 256, CV_8UC1, lutThird);

把三层LUT用多通道合并函数合并

vector<Mat> mergeMat;//建立一个向量mergeMat
mergeMat.push_back(lutOne);
mergeMat.push_back(lutTwo);
mergeMat.push_back(lutThree);
merge(mergeMat,Mat::Lutthree);
LUT(img,lutthree,out);

LUT(img,lutthree,out);这个函数意思是img中的B通道对应第一层查找表,G通道对应第二层查找表,R通道对应第三层查找表
opencv中的显示查找表LUT代码详解

这是原图某一坐标的BGR所对应的像素值
opencv中的显示查找表LUT代码详解

这是经过LUT查找表后,对应的值

上一篇:FPGA的设计艺术(1)FPGA的硬件架构


下一篇:iOS App 导入LUT文件 - PhotoGoTool