目录
一、自适应直方图均衡化是什么?
自适应直方图均衡化(Adaptive Histogram Equalization,AHE)是一种图像处理技术,旨在提升图像的对比度。它通过计算图像的局部直方图,并重新分布亮度来改变图像对比度。
具体来说,自适应直方图均衡化将图像分成很多小的区域或模板,然后对每个模板内的像素进行直方图均衡化处理。这个过程是自适应的,因为它会根据图像的局部特性来调整均衡化的效果。例如,如果某个区域的图像比较暗,那么这个区域的亮度就会被增加,以增强图像的对比度和视觉效果。相反,如果某个区域的图像比较亮,那么这个区域的亮度就会被减少,以防止图像过度曝光或失真。
二、自适应直方图均衡化处理步骤
1、图像分块:将待处理的图像划分成不重叠的子区域或小块。
2、计算子区域的直方图:对每个子区域分别计算其灰度直方图。
3、对子区域进行直方图均衡化:对每个子区域的直方图进行均衡化处理,这样可以增强其对比度和清晰度。
4、合成输出图像:将所有子区域的灰度值按照原始图像的对应位置拼接起来,形成最终的输出图像。
注意:自适应直方图均衡化可以视为局部区域的直方图均衡化,直方图均衡化详解请看下列文章直方图的均衡化原理及代码实现
三、代码实现
自适应直方图均衡化函数:
cv2.createCLAHE(clipLimit=None, tileGridSize=None)
函数参数详解如下:
- clipLimit:控制对比度的提升程度。如果clipLimit值为0,对比度不会提升;如果clipLimit值增大,对比度也会提升。如果clipLimit设置为None,那么这个参数将会被设为默认值1.0。
- tileGridSize:定义了图像被分成多少个区域。如果这个参数为None,那么它会被设为默认值(8,8)。在上述代码中,这个值设为了(16,16),意味着图像将被分成16x16个区域,即将图像分为16*16个区域进行直方图均衡化。
完整代码如下:
phone = cv2.imread('2.jpg',cv2.IMREAD_GRAYSCALE)
phone_hist = cv2.calcHist([phone],[0],None,[256],[0,256])
plt.hist(phone.ravel(), bins=256)#numpy中的ravel将数组多维度拉成一维数组
plt.show()
phone_equalize = cv2.equalizeHist(phone)
plt.hist(phone_equalize.ravel(), bins=256)#numpy中的ravel将数组多维度拉成一维数组
plt.show()
res = np.hstack((phone,phone_equalize))#横向拼接,将多个数组按水平方向(列顺序)堆叠成一个新的数组。
cv2.imshow('phone_equalize',res)
cv2.waitKey(100000)
clahe = cv2.createCLAHE(clipLimit=1.0, tileGridSize=(16,16))#通过类创建了一个局部均衡化对象
phone_clahe = clahe.apply(phone)
res = np.hstack((phone,phone_equalize,phone_clahe))
cv2.imshow('phone_equalize1',res)
cv2.waitKey(100000)
原图展示:
自适应直方图均衡化后结果展示:
以上分别为原图灰度图、直方图均衡化结果图、自适应直方图均衡化结果图
相应直方图结果:
在自适应直方图均衡化中,直方图是指图像的灰度直方图。自适应直方图均衡化是基于整个图像的灰度直方图来调整像素的灰度值分布。通过增加较暗区域的亮度和减少较亮区域的亮度,自适应直方图均衡化可以使图像的灰度级别分布更均匀,从而增强图像的细节和对比度。
四、总结
自适应直方图均衡化是一种有效的图像处理技术,可以根据图像的局部特性来增强其对比度和清晰度。在实际应用中,需要根据具体场景和实际需要来调整参数并进行优化,以达到最佳的图像处理效果。