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函数使用查找表实现上述功能。具体:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201309/03/e58dbd64f585ee279cd2d1db0ab8990e)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201309/03/b13bc7e0c833312e448335ccd35d3176)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201309/03/600ea19306a53f20e85d989fa34e7644)
我们也可以使用查找表去改善图像的对比度。例如,如果我们观察lena图,从灰度直方图可以看出,在比较小的和比较大的像素值地方的像素个数为0,也就是说查找表中的前面和后面的元素没有用到。既然这样,我们可以直接把那些低的(minBin)或者高的(maxBin)个数为0的像素点直接置为0或者255.然后将直方图有像素对应查找表范围(minBin-maxBin)值置为0-255,变化幅度可以使用下式:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201309/03/d50f75799c7027272e6c7a9603914959)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201309/03/bf231735394a2e47cb6c3fbc777e8be4)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201309/03/958b261c5d099c87ee85a0615bdebfeb)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201309/03/1b5bbf9635e09d37e17a05c03335cff6)
可以看出,最后一张图的对比度明显改善。
查找表可以将一个像素值转换成另一个像素值得对照表。它可以是一对一或者多对一(原像素对于新像素)。所以他是一维的,对于规则的灰度图像,它有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时,下面为处理结果:
可以看出,最后一张图的对比度明显改善。
相关文章推荐
- ROS学习笔记(二):利用opencv将本地图片转换成ROS格式
- 我的OpenCV学习笔记(13):计算直方图,利用查找表拉伸直方图,直方图均衡
- ROS学习笔记(二):利用opencv将本地图片转换成ROS格式
- openCV学习笔记(8):利用cvSetImageROI截取/裁剪图片
- 我的OpenCV学习笔记(16):利用工具条调用基本的形态学操作
- OpenCV学习笔记:如何扫描图像、利用查找表和计时
- opencv2学习笔记(二)-OpenCV如何扫描图像、利用查找表和计时
- OpenCV学习笔记:如何扫描图像、利用查找表和计时
- OpenCV 2 学习笔记(8): 利用邻域处理图像与简单的算术图像处理算法:图像滤波与加权和
- opencv学习-imgprocess-为图片增加边界
- opencv-python 学习笔记1:简单的图片处理
- OpenCV学习笔记16-轮廓
- 【opencv学习笔记】1、opencv缩放图片
- opencv学习笔记(十六)——图像对比度和亮度值
- OpenCV学习笔记(16):直方图
- PHP学习笔记:利用gd库给图片打图片水印
- OpenCV学习笔记16 OpenCV图像处理模块ImgProc Module. Image Processing(九)
- OpenCV学习-利用ROI裁剪图片
- openCV学习笔记(5):使用sprintf函数实现在窗口连续显示同一文件夹下的图片
- 【OpenCV学习笔记】【函数学习】十八(保存图片)