LUT(LOOK -UP-TABLE)查找表,我表达能力不好,加上对这个了解的不是很深刻,对于LUP具体解释用文字不好说。不过看下面例子应该可以看懂。
首先我们看单通道图像。
对于8位单通道图片,其像素灰度为0-255,假如我们想将图像某一灰度值换成其他灰度值,用查找就很好用。
例如:我们想将一张图片灰度为0-100的像素的灰度变成0,101-200的变成100,201-255的变成255。我们就可已建立如下的一张表格;
当把此表格应用到图片时,图片0-100灰度的像素灰度就变成0,101-200的变成100,201-255的就变成255。
映射表差不多就是这个意思。
对于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。和单通道一样。
Opencv中的LUT函数
opencv 2中的LUT函数为 void LUT(InputArray src, InputArray lut, OutputArray dst,int interpolation);
src表示的是输入图像(可以是单通道也可是3通道)
lut表示查找表(查找表也可以是单通道,也可以是3通道,如果输入图像为单通道,那查找表必须为单通道,
若输入图像为3通道,查找表可以为单通道,也可以为3通道,若为单通道则表示对图像3个
通道都应用这个表,若为3通道则分别应用 )
dst表示输出图像,
interpolation表示插值,这个参数没有用,源代码里面也没有用它,默认为0就行,传其他值会报错。
opencv3里面的LUT函数 void LUT(InputArray src, InputArray lut, OutputArray dst);
和2一样,不过没有了interpolation这个参数。
源代码
单通道图片处理:
结果显示:#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(); }
3通道彩色图像源代码:
#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(); }
输出结果为:
写完了,可能写的不太好,不过还是希望有一些帮助。