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通道对应第三层查找表
这是原图某一坐标的BGR所对应的像素值
这是经过LUT查找表后,对应的值