您的位置:首页 > 运维架构

OpenCV 2 学习笔记(16): 利用查找表(Look-up table)改善图片质量,增加图像对比度

2013-09-03 21:05 1001 查看
本节是上一节的延伸,代码见:http://download.csdn.net/detail/u010525655/6205345

查找表可以将一个像素值转换成另一个像素值得对照表。它可以是一对一或者多对一(原像素对于新像素)。所以他是一维的,对于规则的灰度图像,它有256个元素。表中的每一个元素对应的值就是新的灰度值,例如如果第3个元素的值为45,那么源图像中像素值为3的值均变为45.

在opencv中cv::LUT函数使用查找表实现上述功能。具体:

cv::Mat applyLookupTable(const cv::Mat &image, const cv::Mat &lookupTable)
{
cv::Mat result;
cv::LUT(image, lookupTable, result);
return result;
}
最简单的我们想把各个像素值的翻转过来,那么查找表可以这样建立:

cv::Mat creatLookupTable(const cv::Mat &image)
{
int i;
cv::Mat lookupTable(1, histSize[0], CV_8U);
for( i = 0; i<histSize[0]; i++)			//histSize[0]是上一节中的,也就是像素值级数

{
lookupTable.at<uchar>(i) = 255-i;
}
return lookupTable;
}
对于灰度lena图结果如下,左边是原始灰度图,右边是反转后的,下面图像是反转过的:







我们也可以使用查找表去改善图像的对比度。例如,如果我们观察lena图,从灰度直方图可以看出,在比较小的和比较大的像素值地方的像素个数为0,也就是说查找表中的前面和后面的元素没有用到。既然这样,我们可以直接把那些低的(minBin)或者高的(maxBin)个数为0的像素点直接置为0或者255.然后将直方图有像素对应查找表范围(minBin-maxBin)值置为0-255,变化幅度可以使用下式:
255.0*(i-imin)/(imax-imin)+0.5);
将上诉思想用代码表述即为:
cv::Mat Histogram::creatLookupTable1(const cv::Mat &image, int minValue)
{
cv::MatND hist= getHistogram(image);
int minBin, i;
for (minBin=0; minBin<histSize[0]; minBin++)
{
if(hist.at<float>(minBin) > minValue)
break;
}

int maxBin;
for(maxBin = histSize[0] -1; maxBin >= 0; maxBin--)
{

if (hist.at<float>(maxBin) > minValue)
break;
}
cv::Mat lookupTable(1, histSize[0], CV_8U);
for( i = 0; i<histSize[0]; i++)
{
if (i<=minBin)
lookupTable.at<uchar>(i) = 0;
else if (minBin < i && i < maxBin)
lookupTable.at<uchar>(i) = static_cast<uchar>
(255.0*(i-minBin)/(maxBin - minBin)+0.5);
else
lookupTable.at<uchar>(i) = 255;
}
return lookupTable;
}
上述代码可以指定minValue,也就是说可以是50或者100,那么前面或者后面bin值小于50或者100的都忽略了。例如当我们取值为50时,下面为处理结果:









可以看出,最后一张图的对比度明显改善。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OpenCV VC++