何为LUT,LUT(Look-Up Table)实际上就是一张像素灰度值的映射表,它将实际采样到的像素灰度值经过一定的变换如阈值、反转、二值化、对比度调整、线性变换等,变成了另外一个与之对应的灰度值,这样可以起到突出图像的有用信息,增强图像的光对比度的作用。
其实查询表的实质就是:把图像中的数据从之前的比较高的灰度级降下来,例如灰度级是256的char类型的灰度级,我们通过一个参数,将原来的256个灰度级降到了3个灰度级,原来图像中灰度值在0-100的数据现在灰度值变成了0,原来灰度值为101-200的图像数据现在灰度值变为了1,而201-256的灰度值就变为了2。所以通过参数100,图像的灰度级就到了2,只有0,1,2三个灰度值,那么原来的图像矩阵中的每一位数据我们是char型的,需要8位来表示一个数据,而灰度级降下来之后,我们只需要2位就足以表示所有灰度值。
OpenCV中LUT函数
void LUT(InputArray src, InputArray lut, OutputArray dst);
//src表示的是输入图像(可以是单通道也可是3通道)
//lut表示查找表(查找表也可以是单通道,也可以是3通道,如果输入图像为单通道,那查找表必须为单通道,若输入图像为3通道,查找表可以为单通道,也可以为3通道,若为单通道则表示对图像3个通道都应用这个表,若为3通道则分别应用 )
//dst表示输出图像
单通道图像
对于8位单通道图片,其像素灰度为0~255,若我们想对图像灰度进行降级,就可以使用LUT。
例如:
我们将一张图片灰度为0~100的像素灰度变成为0,101~200的变成为100,201~255的变成为255。建立如下表格:
当把此表格应用到图片时,图像0-100灰度的像素,灰度就变为0,101-200的变成100,201-255的变成255.
相关代码:
#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 a = imread("C:\\Users\\11206\\Desktop\\OpencvTestImage\\2.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Mat b;
namedWindow("anjis", CV_WINDOW_AUTOSIZE);
namedWindow("anjis1", CV_WINDOW_AUTOSIZE);
imshow("anjis", a);
LUT(a, lut, b);
imshow("anjis1", b);
waitKey();
}
结果显示:
8位3通道图像
对于8位3通道的查找表和单通道的原理一样。OpenCV中内部实现每个通道都分别建立一张表,表格的建立和单通道一样。
处理图像时,分别对每一个通道应用各自的表。
当把上述表格应用到图像时,R通道的0-100灰度的像素灰度值就变为0,101-200的变成100,201-255的变成255.G通道的0-100灰度的像素灰度值变为50,101-200的变成100,201-255的变成200.B通道的0-100灰度的像素灰度值变成50,101-200的变成200,201-255的变成100。和单通道一样。
相关示例代码:
#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("C:\\Users\\11206\\Desktop\\OpencvTestImage\\2.jpg", CV_LOAD_IMAGE_ANYCOLOR);
Mat b;
namedWindow("anjis", CV_WINDOW_AUTOSIZE);
namedWindow("anjis1", CV_WINDOW_AUTOSIZE);
imshow("anjis", a);
LUT(a, lut, b);
imshow("anjis1", b);
waitKey();
}
输出结果:
【参考:】