在opemcv中,实现图像直方图均衡化并不难,但如何理解却要花点时间。
所以在本课的开始,我们来先来了解一下图像直方图均衡化相关的知识
话说回直方图,我们引入直方图,很大程度上是为了让我们可以根据直方图的形态,判断图像的质量,比如根据下图所示,会很快发现一张图片是过亮还是过暗
如果直方图偏暗,偏亮或者亮度过于集中,我们就要对直方图进行修整
在数字图像处理中关于直方图的修整,有两种方法:
直方图均衡化
直方图规定化
我们本课涉及的直方图均衡化,就是比较常用的那一种
直方图均衡化是将原图像通过某种变换,得到一幅灰度直方图为均匀分布的新图像的方法。
其基本思想是
对在图像中像素个数多的灰度级进行展宽
对像素个数少的灰度级进行缩减。
从而达到清晰图像的目的。
现在我们举一个例子说明它的原理
假设有一幅图像64*64大小,共有4096个像素,8个灰度级各灰度级概率分布见下表 ,试将其直方图均匀化。
k 灰度级rk 像素数nk 概率Pk(rk)
0 0 790 0.19
1 1/7 1023 0.25
2 2/7 850 0.21
3 3/7 656 0.16
4 4/7 329 0.08
5 5/7 245 0.06
6 6/7 122 0.03
7 7/7 81 0.02
推导如下:
首先计算直方图概率的累加值S(i),直到最后一个灰度级,总和为1
然后根据公式求取像素映射关系.
得到如下的映射关系
这样就找到了原图像和均衡化图像灰度的对应关系。
如果再对原图进行操作,将每个像素映射成新的像素,就完成了图像均衡化。
图像直方图均衡化可以用于图像增强、对输入图像进行直方图均衡化处理,提升后续对象检测的准确率等。
它在OpenCV人脸检测的代码演示中已经很常见。
此外对医学影像图像与卫星遥感图像也经常通过直方图均衡化来提升图像质量。
具体介绍如下
equalizeHist
均衡灰度图像的直方图
共2个参数
第1个参数 输入
第2个参数 输出
实例代码
//函数定义
void histogram_eq_demo(Mat& image);
//函数实现
void QuickDemo::histogram_eq_demo(Mat& image) {
Mat gray;
cvtColor(image, gray, COLOR_BGR2GRAY);
imshow("灰度图像", gray);
Mat dst;
equalizeHist(gray, dst);
imshow("直方图均衡化演示",dst);
}
从上文我们可以知道,直方图均衡化就是对亮度的一个调整,使之分布均匀
而在HSV色彩空间中,V通道关于亮度的,所以我们实现彩色图像的均衡化可以从V通道着手。
步骤如下:
先把图像色彩空间转为HSV,并把HSV三个通道分离
然后V通道进行均衡化,再把三个通道合并
最后转回BGR色彩空间
这样就实现了彩色图像直方图的均衡化
示例代码:
void QuickDemo::histogram_eq_demo(Mat& image) {
Mat hsv,dst[3],src;
cvtColor(image,hsv, COLOR_BGR2HSV);
split(hsv, dst);
equalizeHist(dst[2], dst[2]);
merge(dst,3,src);
cvtColor(src, src,COLOR_HSV2BGR);
imshow("00",src);
}