【OpenCV】之LUT函数

何为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();  
}  

输出结果:
这里写图片描述
【参考:】

  1. http://blog.csdn.net/anjisi/article/details/53899222
  2. http://blog.csdn.net/jameshater/article/details/50759650

猜你喜欢

转载自blog.csdn.net/y363703390/article/details/79431450
今日推荐