opencv2—(8)查找表修改图像外观

图像直方图捕捉方式呈现一个场景使用可像素强度值。通过分析像素值得分布在一个图像,可以使用此信息来修改甚至可以提高一个图像。查找表定义了如何将像素值转换为新的值。表的第i项表示相应对应灰度的新值。newIntensity= lookup [ oldIntensity ]  ; OpenCV cv::LUT 对图像应用查找表以生成新图像。
可能说到这里,大家还是不太清楚怎么用,下面写两个函数来创建不同的table实现图像外观的修改
第一个函数:降低颜色空间
那么让我们回顾之前 opencv2—(3)遍历图像 中介绍的降低颜色数目的算法,把RGB空间划分为同等大小的格子,每个纬度的颜色降低为原来的1/8,那么总的颜色数为32*32*32,原始图像的每个颜色都替换为所在格子中心对应的颜色。而今天我们将使用查找表的方法,来实现降低颜色空间的方法。
第二个函数:颜色反转
交换强度值即可
第三个函数:增强对比度(思考题)
提高对比度的查找表旨在检测直方图中的非零项的最低(imin)和最高(imax)强度值,这样(imin)值被映射到强度0,(imax)值被映射到255。

下面贴程序:

#include <opencv2\highgui\highgui.hpp>
#include <opencv2\core\core.hpp>
#include <iostream>
using namespace std;
using namespace cv;
#define QUAN_VAL1           (10)
#define QUAN_VAL2           (100)
//降低颜色空间的table
void CreateLookupTable( Mat & table , uchar quan_val )
{
        table .create(1, 256, CV_8UC1 );
        uchar *p = table .data;
        for ( int i = 0; i < 256; ++i)
       {
              p[i] = quan_val *(i / quan_val );
       }
}
//颜色反转
void CreateLookupTable1( Mat & table )
{
        table .create(1, 256, CV_8UC1 );
        uchar *p = table .data;
        for ( int i = 0; i < 256; i++)
       {
              p[i] = 255 - i;
       }
}
int main( int argc , char * argv [])
{
        Mat img;
        Mat out1,out2,out3;
       img = imread( "group.jpg" , 1);
        Mat table;
       CreateLookupTable(table, QUAN_VAL1 );
       LUT(img, table, out1);// 使用  LUT(img, table, out)的时候就等价于out[rows][cols]=table[(img[rows][cols]) ]
       CreateLookupTable(table, QUAN_VAL2 );
       LUT(img, table, out2); 

        CreateLookupTable1(table);
        LUT(img, table, out3);

       namedWindow( "Lena" , CV_WINDOW_NORMAL );
       imshow( "Lena" , img);
       namedWindow( "QUAN_VAL=10" , CV_WINDOW_NORMAL );
       imshow( "QUAN_VAL=10" , out1);
       namedWindow( "QUAN_VAL=100" , CV_WINDOW_NORMAL );
       imshow( "QUAN_VAL=100" , out2);
        namedWindow( "颜色反转" , CV_WINDOW_NORMAL );
        imshow( "颜色反转" , out3);

       waitKey(0);
        return 0;
}

分析:
查找表其实就相当于函数的一种映射关系 x=0:255 ,y = f(x),当然关于f(x)的具体形式可以是任意的,本文的形式是
1、 p[i] =quan_val * (i /quan_val);
2、 p[i] =255-i
3、 ?
i相当于x,p相当于y,只是我们可以先把它们的映射关系存起来放在table中,到了调用LUT函数时,就不用再去计算这样的映射关系,而是通过访问刚刚存放的table来获取结果,在数据大的情况下,减少了计算的时间,显得更高效。

下面是结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值