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

本文介绍了自适应直方图均衡化(AdaptiveHistogramEqualization,AHE)的概念和原理,以及如何使用OpenCV的CLAHE函数来避免全局直方图均衡化带来的失真和噪声问题。文章提供了C++代码示例,并讨论了对比度限制在处理图像噪声中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

😊😊😊欢迎来到本博客😊😊😊

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

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

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


学习目标

  • 熟悉自适应直方图均衡化概念及原理
  • 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,重构后的直方图如图(右)所示,接下来利用重构后的直方图进行均衡化操作。

  可以看到,此时的直方图又会整体上升了一个高度,但也有部分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实现的限制对比度的自适应直方图均衡化函数,其实在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是学习图像处理理论知识比较好的一个途径,大家也可以自己尝试写写博客,来记录大家平时学习的进度,可以和网上众多学者一起交流、探讨,有什么问题希望大家可以积极评论交流,我也会及时更新,来督促自己学习进度。希望大家觉得不错的可以点赞、关注、收藏。


🚶🚶🚶 今天的文章就到这里啦~
喜欢的话,点赞👍、收藏⭐️、关注💟哦 ~
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Carlos.Cqy阳

预祝上岸,感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值