图像直方图捕捉方式呈现一个场景使用可像素强度值。通过分析像素值得分布在一个图像,可以使用此信息来修改甚至可以提高一个图像。查找表定义了如何将像素值转换为新的值。表的第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来获取结果,在数据大的情况下,减少了计算的时间,显得更高效。
下面是结果: