在处理图片的时候,有时候需要对其进行一个映射。比如将灰度图的值对应到RGB的值,或者将灰度图由某个区间映射到另外一个区间,这时候就需要lut了,lut是look up table查找表的意思。
这是我参考的博客链接
https://blog.csdn.net/anjisi/article/details/53899222
1 单通道映射到单通道
#include<highgui\highgui.hpp>
using namespace cv;
int main()
{
//查找表,数组的下标对应图片里面的灰度值
//例如lutData[20]=0;表示灰度为20的像素其对应的值0.
uchar lutData[256];
for (int i = 0; i<256; i++)
{
if(i<=100)
lutData[i] =0;
if (i > 100 && i <= 200)
lutData[i] = 100;
if (i > 200)
lutData[i] = 255;
}
Mat lut(1, 256, CV_8UC1, lutData); //创建Mat,表示映射信息
Mat a = imread("1.png", CV_LOAD_IMAGE_GRAYSCALE);
Mat b;
LUT(a, lut, b);
}
2 单通道映射到三通道
需要注意的是,首先要将灰度图,转成RGB格式,然后才能使用lut进行映射。
#include<highgui\highgui.hpp>
using namespace cv;
int main()
{
uchar lutData[256 * 3];
int j = 0;
for (int i = 0; i<256; i++)
{
if (i <= 100)
{
lutData[i * 3] = 0;
lutData[i * 3 + 1] = 50;
lutData[i * 3 + 2] = 50;
}
if (i > 100 && i <= 200)
{
lutData[i * 3] = 100;
lutData[i * 3 + 1] = 10;
lutData[i * 3 + 2] = 200;
}
if (i > 200)
{
lutData[i * 3] = 255;
lutData[i * 3 + 1] = 200;
lutData[i * 3 + 2] = 100;
}
}
Mat lut(1, 256, CV_8UC3, lutData);
Mat a = imread("2.png", CV_LOAD_IMAGE_GRAYSCALE);
//先将灰度图转成RGB图片,然后再进行映射
cv::cvtColor(res, res, cv::COLOR_GRAY2RGB);
Mat b;
LUT(a, lut, b);
}