对比度受限的自适应直方图均衡在OpenCV中是通过类CLAHE来提供实现的,老猿没研究过C++中的应用,但OpenCV-Python中应用时与普通的Python类构建对象的机制有所不同,老猿做了相关测试,在此简单介绍一下。
CLAHE类是OpenCV中进行对比度受限的自适应直方图均衡的基类,其类继承关系如下:
其父类和子类老猿没有研究过,在此就不展开介绍。
该类有2个重要属性:
apply方法用于对图像应用对比度受限自适应直方图均衡变换处理。
调用语法: dst = cv.CLAHE.apply( src[, dst] )
参数说明:
补充说明:在进行该方法调用前,必须已经设置了对比度受限自适应直方图均衡算法的受限对比度ClipLimit以及图像分块的行数和列数tiles
collectGarbage方法应该是进行内存垃圾回收的,没有参数和返回值,老猿认为由于Python的内存管理机制,该方法没有什么意义,同时测试没有发现执行该方法起何作用,因此很可能是个无用的方法。
getClipLimit方法是用于获取当前CLAHE对象设置的ClipLimit值返回。
调用语法: retval = cv.CLAHE.getClipLimit()
getClipLimit方法是用于获取当前CLAHE对象设置的tilesGridSize返回。
调用语法: retval = cv.CLAHE.getTilesGridSize()
方法是用于设置当前CLAHE对象的ClipLimit值,无返回值。
调用语法: None = cv.CLAHE.setClipLimit( clipLimit )
方法是用于设置当前CLAHE对象的tilesGridSize值,无返回值。
调用语法: None = cv.CLAHE.setTilesGridSize( tileGridSize )
从上面的方法介绍中,没有看到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++中是否能使用,老猿没有去研究。
由于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('\033[31m老猿Python网址:\033[34mhttps://blog.csdn.net/LaoYuanPython\033[0m,同名微信公众号:\033[34m老猿Python')
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方法就可以完成对比度受限自适应直方图均衡处理,该类的其他方法用处不大,但如果是要进行多次对比度受限自适应直方图均衡处理,且需要设置不同的分块数和受限阈值,则可以通过提供的方法直接修改对象属性再进行均衡处理即可。
更多图像直方图处理的内容请参考《《数字图像处理》第三章学习总结感悟2:直方图处理》的介绍。
更多图像处理的内容请参考专栏《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》、《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》及《图像处理基础知识》的介绍。
如对文章内容存在疑问,可在博客评论区留言,或关注博客左边的:老猿Python 微信公号发消息咨询。
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。