OpenCV2 直方图均衡化
来源:互联网 发布:哈工程教务处网络选课 编辑:程序博客网 时间:2024/05/18 00:31
直方图的均衡化
我们先来看看原图的直方图
我们发现高亮区域的像素点很少,主要像素点集中在中低亮度区域
我们先设置一个阈值,也就是图中的那根粉色的线,
当某一亮度值的像素点的个数低于这个值时,我们认为这些像素点是无关紧要的。
灰度图的亮度值范围是0-255,若亮度值为1的像素点的个数低于阈值,我们可简单的把亮度为1的像素点的亮度
全设为0,同理,我们从高往低找,若亮度值为254的像素点的个数低于阈值,我们可以把这些像素点的亮度设为255
这样我们可以从小到大,从大到小分别找到两个亮度,它们的像素点的个数恰大于阈值
他们之间的区域,我们可以认为是有效区域,也就是蓝色框出来的区域
我们把这一区域扩展到0-255的区域去,可实现均衡化效果
编程实现为
cv::Mat Histogram::stretch1(const cv::Mat& image, int minValue) { cv::MatND hist = getHistogram(image); int imin =0; for (; imin < histSize[0]; imin++) { if (hist.at<float>(imin) > minValue) { break; } } int imax = histSize[0] -1; for (; imax >=0; imax--) { if (hist.at<float>(imax) > minValue) { break; } } cv::Mat lookup(cv::Size(1, 256), CV_8U); for (int i =0; i <256; i++) { if (i < imin) { lookup.at<uchar>(i) =0; } elseif (i > imax) { lookup.at<uchar>(i) =255; } else { lookup.at<uchar>(i) = static_cast<uchar>(255.0* (i - imin) / (imax - imin) +0.5);} } cv::Mat result; cv::LUT(image, lookup, result); return result;}
对于cv::LUT函数,我之前就介绍过了
可以看出拉伸后的直方图和原直方图形状是一致的
再来看看另一种直方图均衡化的思路
理想的直方图均衡化效果是希望每个亮度的像素点的个数都相同
我们设原亮度为 i 的点均衡化后亮度为S(i),原亮度为 i 的点的个数为N(i)
其占总像素点的概率为p(i) = N(i) / SUM; SUM为像素点的总和
可以得到公式
S(0) = p(0)*255
S(1) = [p(0)+p(1)]*255
S(2) = [p(0)+p(1)+p(2)]*255
........
S(255) = [p(0)+p(1)+......+p(255)]*255 = 255
我们在原图中将亮度为 i 的像素点赋值为 S(i),就可以实现均衡化了
cv::Mat Histogram::stretch2(const cv::Mat& image) { cv::MatND hist = getHistogram(image); float scale[256]; float lookupF[256]; cv::Mat lookup(cv::Size(1, 256), CV_8U); int pixNum = image.cols * image.rows; for (int i =0; i <256; i++) { scale[i] = hist.at<float>(i) / pixNum *255; if (i ==0) { lookupF[i] = scale[i]; } else { lookupF[i] = lookupF[i -1] + scale[i]; } } for (int i =0; i <256; i++) { lookup.at<uchar>(i) = static_cast<uchar>(lookupF[i]); } cv::Mat result; cv::LUT(image, lookup, result); return result;}cv::Mat Histogram::stretch3(const cv::Mat& image) { cv::Mat result; cv::equalizeHist(image, result); return result;}
在这里,我们定义了两个函数,一个按照刚才的思路来实现
另一个是OpenCV2 提供的标准的均衡化函数
我们来看看效果
两种方法得到的效果和直方图的形状几乎一模一样
可见,标准的均衡化方法也是按此思路实现的
具体的源代码就不研究了
- OpenCV2 直方图均衡化
- opencv2直方图均衡化
- OpenCV2 直方图均衡化
- OpenCV2 直方图均衡化
- 基于opencv2的直方图均衡化
- 图像处理opencv2-灰度直方图以及灰度直方图均衡化
- (34)Air Band OpenCV2.4.13_直方图均衡化
- OpenCV2编程手册笔记之 4.4直方图均衡化
- 直方图均衡化、自适应直方图均衡化
- OpenCV2.4.4中利用直方图均衡化增强图像对比度(Mat结构实现)
- OpenCV2马拉松第9圈——再谈对比度(对比度拉伸,直方图均衡化)
- OpenCV2.4.4中利用直方图均衡化增强图像对比度(Mat结构实现)
- 直方图均衡化推导
- 直方图均衡化
- 直方图均衡化
- 直方图均衡化
- 直方图均衡化
- 灰度直方图均衡化
- IE10 下CSS3选择器及动画(animation)效果实例教程
- 杭电2043
- 翻硬币
- JAVA 在 ACM 中的使用
- UCCX客户端XP系统中报错:java.lang.NullPointerException
- OpenCV2 直方图均衡化
- 图像处理之泛洪填充算法(Flood Fill Algorithm)
- Eclipse上GIT插件EGIT使用手册
- Flex4之Tree开发【一】
- 开发者需知的10类工具
- 教你如何迅速秒杀掉:99%的海量数据处理面试题
- 百度最新面试题集锦
- C程序设计课程-2012电子信息 第七次实验任务
- 阿里巴巴的面试