【图像处理OpenCV(C++版)】——4.6 限制对比度的自适应直方图均衡化

前言

欢迎来到本博客

本专栏主要结合OpenCV和C++来实现一些基本的图像处理算法并详细解释各参数含义,适用于平时学习、工作快速查询等,随时更新。

具体食用方式:可以点击本专栏【OpenCV快速查找(更新中)】–>搜索你要查询的算子名称或相关知识点,或者通过这篇博客通俗易懂OpenCV(C++版)详细教程——OpenCV函数快速查找(不断更新中)]查阅你想知道的知识,即可食用。

支持:如果觉得博主的文章还不错或者您用得到的话,可以悄悄关注一下博主哈,如果三连收藏支持就更好啦!这就是给予我最大的支持!


文章目录

    • 学习目标
    • 一、概念及原理
      • 1.1 相关概念及原理
    • 二、 代码实现
    • 三、 总结

学习目标

  • 熟悉自适应直方图均衡化概念及原理
  • C++实现自适应直方图均衡化案例

  上一节介绍了更为方便的方法来自动调节图像对比度——全局直方图均衡化但是原图中比较亮的区域,经过全局直方图均衡化处理后会出现了失真的情况,而且出现了明显的噪声。该如何处理呢?

一、概念及原理

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,重构后的直方图如图(右)所示,接下来利用重构后的直方图进行均衡化操作。

【图像处理OpenCV(C++版)】——4.6 限制对比度的自适应直方图均衡化_第1张图片

  可以看到,此时的直方图又会整体上升了一个高度,但也有部分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) 若幅值处于UpperClipLimit之间,将其填补至ClipLimit
      3) 若幅值低于Upper,直接填补L个像素点;

  经过上述操作,用来填补的像素点个数通常会略小于TotalNum,还有一些剩余的像素点没分出去。可以再把这些点均匀地分给那些目前幅值仍然小于ClipLimit的灰度值。

【图像处理OpenCV(C++版)】——4.6 限制对比度的自适应直方图均衡化_第2张图片

二、 代码实现

  关于OpenCV实现的限制对比度的自适应直方图均衡化函数,其实在OpenCV中并没有提及相关函数,提供了函数createCLAHE()来构建指向CLAHE对象的指针,其中默认设置“限制对比度(clipLimit=(40.0)),块的大小为8×8

#include 
#include  
# include 
#include
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是学习图像处理理论知识比较好的一个途径,大家也可以自己尝试写写博客,来记录大家平时学习的进度,可以和网上众多学者一起交流、探讨,有什么问题希望大家可以积极评论交流,我也会及时更新,来督促自己学习进度。希望大家觉得不错的可以点赞、关注、收藏。


今天的文章就到这里啦~
喜欢的话,点赞、收藏⭐️、关注哦 ~

你可能感兴趣的:(#,OpenCV(C++),opencv,图像处理,c++,算法,计算机视觉)