第十三章:OpenCV-Python自适应直方图均衡类CLAHE及方法详解-灵析社区

金某某的算法生活

一、引言

对比度受限的自适应直方图均衡在OpenCV中是通过类CLAHE来提供实现的,老猿没研究过C++中的应用,但OpenCV-Python中应用时与普通的Python类构建对象的机制有所不同,老猿做了相关测试,在此简单介绍一下。

二、CLAHE类及方法介绍

2.1、简介

CLAHE类是OpenCV中进行对比度受限的自适应直方图均衡的基类,其类继承关系如下:

其父类和子类老猿没有研究过,在此就不展开介绍。

该类有2个重要属性:

tilesGridSize:图像被分成称为“tiles”(瓷砖、地砖、小方地毯、片状材料、块状材料)的小块,在OpenCV中,tilesGridSize默认为8x8 ,即整个图像被划分为8纵8横共64块。然后对每一个块进行直方图均衡处理

clipLimit:裁剪限制,此值与对比度受限相对应,对比度限制这个参数是用每块的直方图的每个bins的数和整图的平均灰度分布数的比值来限制的。 裁剪则是将每块图像直方图中超过ClipLimit的bins多出的灰度像素数去除超出部分,然后将所有bins超出的像素数累加后平均分配到所有bins。具体算法老猿将在研究清楚后单独介绍。

2.2、成员方法简介

2.2.1、apply方法

apply方法用于对图像应用对比度受限自适应直方图均衡变换处理。

调用语法: dst = cv.CLAHE.apply( src[, dst] )

参数说明:

src:输入图像,图像类型为CV_8UC1 or CV_16UC1,即8位或16位灰度图

dst:输出图像,类型同输入图像

补充说明:在进行该方法调用前,必须已经设置了对比度受限自适应直方图均衡算法的受限对比度ClipLimit以及图像分块的行数和列数tiles

2.2.2、collectGarbage方法

collectGarbage方法应该是进行内存垃圾回收的,没有参数和返回值,老猿认为由于Python的内存管理机制,该方法没有什么意义,同时测试没有发现执行该方法起何作用,因此很可能是个无用的方法。

2.2.3、getClipLimit方法

getClipLimit方法是用于获取当前CLAHE对象设置的ClipLimit值返回。

调用语法: retval = cv.CLAHE.getClipLimit()

2.2.4、getTilesGridSize方法

getClipLimit方法是用于获取当前CLAHE对象设置的tilesGridSize返回。

调用语法: retval = cv.CLAHE.getTilesGridSize()

2.2.5、setClipLimit方法

方法是用于设置当前CLAHE对象的ClipLimit值,无返回值。

调用语法: None = cv.CLAHE.setClipLimit( clipLimit )

2.2.6、setTilesGridSize方法

方法是用于设置当前CLAHE对象的tilesGridSize值,无返回值。

调用语法: None = cv.CLAHE.setTilesGridSize( tileGridSize )

三、CLAHE对象的构建

3.1、CLAHE构造方法研究

从上面的方法介绍中,没有看到CLAHE的构造方法,在OpenCV文档中,确实没有这个CLAHE的构造方法,在Python的CLAHE.py模块中,有该类的构造方法的定义:

def __init__(self, *args, **kwargs): # real signature unknown
    pass

没有任何参数的说明,在老猿找到的该类的C++类的构造方法如下:

int CLAHE(kz_pixel_t* pImage, unsigned int uiXRes, nsigned int uiYRes, kz_pixel_t Min,      kz_pixel_t Max, unsigned int uiNrX, unsigned int uiNrY, unsigned int uiNrBins, float fCliplimit);

老猿以C++构造方法为依据构建了Python中的CLAHE类,构造方法确实返回了CLAHE对象,但以此调用相关方法全部出现代码异常退出。基本上说明OpenCV-Python中CLAHE的构造方法不可用,至于C++中是否能使用,老猿没有去研究。

3.2、createCLAHE函数

由于OpenCV-Python中CLAHE的构造方法无法使用,同时在OpenCV中,提供了单独的全局函数createCLAHE,因此OpenCV-Python中CLAHE对象的构建必须通过createCLAHE函数。

调用语法:retval = cv.createCLAHE( clipLimit=40,tileGridSize=(8,8))

参数及返回值说明:clipLimit、tileGridSize请参考前面关于类的介绍,返回值为创建的类对象,该对象的clipLimit、tileGridSize由createCLAHE函数的参数指定。

四、示例代码

下面的代码使用OpenCV-Python对读入的图像进行对比度受限自适应直方图均衡处理:
import cv2
def testLocalHistEqu():
    img = readImgFile(r'f:\pic\valley.png', True)
    
    print('666')

    clahe = cv2.createCLAHE(clipLimit=200, tileGridSize=(5, 5))
  
    cl2 = clahe.getClipLimit()
    clahe.setClipLimit(20)
    cl1 = clahe.getClipLimit()
    clahe.setTilesGridSize((8,8))

    imgEquA = clahe.apply(img)

上面的代码中创建CLAHE对象后,对对象的属性进行了读写操作,其实这些代码完全没有必要。

五、小结

本文介绍了OpenCV-Python对比度受限自适应直方图均衡变换的CLAHE类及其方法,并通过代码介绍了相关方法的使用。在单图像的对比度受限自适应直方图均衡时,只需要使用createCLAHE创建CLAHE对象,然后调用该对象apply方法就可以完成对比度受限自适应直方图均衡处理,该类的其他方法用处不大,但如果是要进行多次对比度受限自适应直方图均衡处理,且需要设置不同的分块数和受限阈值,则可以通过提供的方法直接修改对象属性再进行均衡处理即可。

阅读量:2021

点赞量:0

收藏量:0