![](https://i-blog.csdnimg.cn/blog_migrate/71d9f5e131a4586f37d9721c0d9291fd.png)
一、引言
对比度受限的自适应直方图均衡在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('\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 微信公号发消息咨询。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
关于老猿的付费专栏
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录 》
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10762553.html Python爬虫入门 》站在一个互联网前端开发小白的角度介绍爬虫开发应知应会内容,包括爬虫入门的基础知识,以及爬取CSDN文章信息、博主信息、给文章点赞、评论等实战内容。
前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。