一、引言

对比度受限的自适应直方图均衡在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 unknownpass

没有任何参数的说明,在老猿找到的该类的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 微信公号发消息咨询。

写博不易,敬请支持:

如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

关于老猿的付费专栏

  1. 付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
  2. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
  3. 付费专栏《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初学者疑难问题集专栏目录 》
  4. 付费专栏《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。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

老猿Python,跟老猿学Python!

☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░

OpenCV-Python自适应直方图均衡类CLAHE及方法详解相关推荐

  1. Python的Django框架中forms表单类的使用方法详解2

    用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...

  2. Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)

    Python 在子类中调用父类方法详解(单继承.多层继承.多重继承)   by:授客 QQ:1033553122   测试环境: win7 64位 Python版本:Python 3.3.5 代码实践 ...

  3. python移动平均线绘图_对python pandas 画移动平均线的方法详解

    数据文件 66001_.txt 内容格式: date,jz0,jz1,jz2,jz3,jz4,jz5 2012-12-28,0.9326,0.8835,1.0289,1.0027,1.1067,1.0 ...

  4. python中验证码连通域分割的方法详解

    python中验证码连通域分割的方法详解 这篇文章主要给大家介绍了关于python中验证码连通域分割的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用python具有一定的参考学习价值,需 ...

  5. python截图黑屏_对Python获取屏幕截图的4种方法详解

    Python获取电脑截图有多种方式,具体如下: PIL中的ImageGrab模块 windows API PyQt pyautogui PIL中的ImageGrab模块 import time imp ...

  6. python list遍历删除,对python list 遍历删除的正确方法详解

    在遍历list的时候,删除符合条件的数据,可是总是报异常,代码如下: num_list = [1, 2, 3, 4, 5] print(num_list) for i in range(len(num ...

  7. Python精讲:在Python中遍历字典的三大方法详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中遍历字典的三大方法详解>.本知识点主要内容有:使用字典对象的items()方法可以遍历字典的项和字典的&qu ...

  8. python fileinput_python文件处理fileinput使用方法详解

    这篇文章主要介绍了python文件处理fileinput使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.介绍 fileinput模块 ...

  9. python定时任务crontab_【Python】Linux crontab定时任务配置方法(详解)

    CRONTAB概念/介绍 crontab命令用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于"crontab"文件中,以供之后读取和执行. cron 系统调度 ...

最新文章

  1. hung-yi lee_p17_卷积神经网络
  2. 关于布线设计方案+网络产品的一个网站
  3. MultiByteToWideChar和WideCharToMultiByte
  4. python2中的print语句可以不用小括号。_Python 2与Python 3的区别
  5. 工作111:直接写url
  6. github怎么隐藏自己的pr记录_在GitHub中向开源框架提交PR的过程
  7. Oracle实例之间的心跳机制,为何而心跳-Oracle Heartbeat研究之二
  8. MySQL服务器地址为空,C++/MySQL - 通过主机地址访问数据库时'未知的MySQL服务器主机';没有IP...
  9. Caffe常见神经网络结构——汇总与对比
  10. 微型计算机基础知识答案,计算机基础知识授课试题及答案
  11. 经纬度(度分秒)和十进制相互转换
  12. matlab距离平方和公式推导,求助高手,用matlab求两幅图像平方和再开根号公式怎样表达?...
  13. 济南月薪一万是什么水平?
  14. NPOI操作Excel类代码(打开 插入 设置行列宽 合并单元格 增删改工作表 保存等等) .NET4.5
  15. golang 修改全局默认时区的方法
  16. 行列视(RCV)生产数据应用系统产品简介
  17. CMarkup类操作XML
  18. vue 中provide的用法_Vue中使用provide和inject
  19. 软件学院“SIdea”软件创意大赛
  20. Servlet规范之安全

热门文章

  1. (YOLOv3训练超详细教程)在Ubuntu 18.04下使用YOLOv3训练数据(提供源码及文件夹)
  2. 高通Android源码下载
  3. CocosCreator 渲染
  4. Biu~送你 20 个提供远程工作的网站,都很棒
  5. theano 安装_Theano-安装
  6. wordpress配置SMTP服务发送邮件(qq邮箱)
  7. 室内温度控制仿真(Simulink+PLC)
  8. KYODO 泰和 AL809 手台 对讲机 写频线 定义
  9. 国内外经典开源数据大全!
  10. WIN10下OpenCV4.1.0与VS2017安装