文章目录
- 学习目标
- 一、概念及原理
- 1.1 相关概念及原理
- 二、 代码实现
- 三、 总结
学习目标
上一节介绍了更为方便的方法来自动调节图像对比度——全局直方图均衡化,但是原图中比较亮的区域,经过全局直方图均衡化处理后会出现了失真的情况,而且出现了明显的噪声。该如何处理呢?
一、概念及原理
1.1 相关概念及原理
关于自适应直方图均衡化步骤如下:
首先,将图像划分为不重叠的区域块;然后,对每一个块分别进行直方图均衡化。在没有噪声影响的情况下,每一个小区域的灰度直方图会被限制在一个小的灰度级范围内;但是如果有噪声,每一个分割的区域块执行直方图均衡化后,噪声会被放大。最后,为了避免出现噪声这种情况,利用“限制对比度(Contrast Limiting)”的方式,如果直方图的bin
超过了提前预设好的“限制对比度”,那么会被裁减,然后将裁剪的部分均匀分布到其他的bin,这样就重构了直方图。
————————————————
小知识:灰度与彩色直方图bin的含义
1、计算颜色直方图时,横坐标是颜色空间,纵坐标是该颜色的像素点的数量。
2、对于RGB而言,每个通道都有0到255个灰度集,即一共256个。如果采用bins=1的思路,则有 256 x 256 x 256 个横坐标,并且横坐标对应的纵坐标的值也比较少(一个图中像素值相同的也不多)
3、为解决这种问题,采用了合并的思想,也就出现了bin。计算颜色直方图需要将颜色空间划分为若干个小的颜色区间。对于每个颜色通道(R,G,B),每32个划分到一个bin里面(具体一个bin中的区间为多少可以视情况而定)。排列组合后,有8 x 8 x 8 一共有512 bin ,也就是直方图的横坐标共512个刻度。
R:0到255 划分为 8个bin
G:0到255 划分为 8个bin
B:0到255 划分为 8个bin
举个例子:假设一个像素的R,G,B,3个通道的取值分别为2,5,4,那么在bins下的坐标就应该为(1,1,1)。
因为2相对于R通道来说属于第一个bins,后面的同理。
如下图所示,假设设置“限制对比度”为50,第3个bin所对应的像素个数大于50,然后将多出的将会均匀分布到每一个bin,重构后的直方图如图(右)所示,接下来利用重构后的直方图进行均衡化操作。
可以看到,此时的直方图又会整体上升了一个高度,但也有部分bin
会超过我们设置的上限(如地5个bin)。当然,在实现的时候有很多解决方法,可以多重复几次裁剪过程,使得上升的部分变得微不足道,也可以用另一种常用的方法:
示例: 假设图中裁剪值为ClipLimit=50
。
(1) 求出直方图中高于该值的部分的和TotalNum
(图中只有一个bin
超过ClipLimit
,假设为82,即82-50=32);
(2) 假设将TotalNum
均分给所有灰度级,直方图整体上升的高度L=TotalNum/N,即32/(256/16)=2
;
(3) 同时以upper= ClipLimit-L
为界限对直方图进行如下处理:
1) 若幅值高于ClipLimit
,直接置为ClipLimit
,即图中第5个bin
;
2) 若幅值处于Upper
和ClipLimit
之间,将其填补至ClipLimit
;
3) 若幅值低于Upper
,直接填补L个像素点;
经过上述操作,用来填补的像素点个数通常会略小于TotalNum,还有一些剩余的像素点没分出去。可以再把这些点均匀地分给那些目前幅值仍然小于ClipLimit
的灰度值。
二、 代码实现
关于OpenCV实现的限制对比度的自适应直方图均衡化函数,其实在OpenCV中并没有提及相关函数,提供了函数createCLAHE()
来构建指向CLAHE
对象的指针,其中默认设置“限制对比度(clipLimit=(40.0))
,块的大小为8×8
。
#include <iostream>
#include <opencv2/opencv.hpp>
# include <opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv ;
int main() {
Mat src = imread(D:/VSCodeFile/0penCV_CSDN/image/img3.jpg);
//Mat src;
if (src.empty() {
cout<<“the image is empty!" <《< endl;
//全局直方图均衡化
Mat gray;
cvtColor(src, gray, COLOR_BGR2GRAY);
Mat dst;
equalizeHist(gray, dst);
//限制对比度的自适应直方图均衡化
//构建CLAHE 对象
Ptr<CLAHE> clahe = createCLAHE(2.0, Size(8, 8));
Mat dst1;
// 限制对比度的自适应直方图均衡化
clahe->apply(gray, dst1);
//图片显示
imshow("原图", src);
imshow("直方图均衡化演示", dst);
imshow("对比度增强", dst1);
waitKey (0) ;
return 0;
}
结果显示了对原图进行全局直方图均衡化(HE
)和限制对比度自适应直方图均衡化(CLAHE
)的效果,仔细观察会发现原图中比较亮的区域,经过HE
处理后出现了失真的情况(两个人体已经模糊),而且出现了明显的噪声,而CLAHE
避免了这两种情况。
对比度增强只是图像增强方法中的一种手段,目前提到的对比度拉伸的方法受图像噪声的影响会很明显,在下一章内容开始介绍去除噪声的方法,去噪之后再使用对比度增强技术效果会更好。
三、 总结
最后,长话短说,大家看完就好好动手实践一下,切记不能三分钟热度、三天打鱼,两天晒网。OpenCV是学习图像处理理论知识比较好的一个途径,大家也可以自己尝试写写博客