OpenCV使用python实现限制对比度的自适应直方图均衡化

前面讲到的自适应直方图均衡化的实现方法首先是将图像划分成不重叠的区域块,让后对每个块分别进行直方图均衡化处理。如果在图像有噪声的情况下这样处理,在每个被分割的小区域块中的噪声就会被放大。

为了避免噪声对图像均衡化的影响,这里使用了限制对比度的自适应直方图均衡化来处理图像的直方图均衡化。

限制对比度的直方图均衡化的处理方式是先为直方图设置一个阈值,该阈值为限制对比度值,超过该阈值的值会被裁剪,然后裁剪的部分会均匀的分布到其他值上,这样就重构了直方图,接下来就可以用重构后的直方图来进行接下来的均衡化操作了。

下面是限制对比度的操作示例图,我这边用excel图来进行展示:

阈值为40时,超出阈值的为50这个直方图区域,将多出的50-40=10的部分均匀分布到每个区域上,平均每个区域增加的值为2

注意:在OpenCV手册中没有提及到限制对比度的自适应直方图均衡化函数。

具体的python实现限制对比度的自适应直方图均衡化代码如下:

# -*_ coding:utf-8-*-

import cv2

import numpy as np

import sys

#主函数

if __name__ == "__main__":

    if len(sys.argv) > 1:

        #第一步:读入图像

        src  = cv2.imread(sys.argv[1],cv2.IMREAD_ANYCOLOR)

    else:

        print "请输入图像"

    #创建CLAHE对象

    clahe = cv2.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))

    #将每个帧转换为灰度或将其应用于每个通道(转换为灰度)

    gray_image = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

    #限制对比度的自适应阈值均衡化

    dst = clahe.apply(gray_image)

    #显示图像

    cv2.imshow("原图",src)

    cv2.imshow("直方图均衡化",dst)

    cv2.waitKey(0)

    cv2.destroyAllWindows()

其中默认设置的“限制对比度”为40,块的大小为8X8

程序运行后的效果如下图所示: