![](https://i-blog.csdnimg.cn/blog_migrate/71d9f5e131a4586f37d9721c0d9291fd.png)
一、引言
在《OpenCV自适应直方图均衡CLAHE的clipLimit的含义及理解》,老猿结合源代码介绍了clipLimit裁剪限制值的意义,但没有来得及介绍具体裁剪过程,下面就结合源代码介绍一下自适应直方图均衡的裁剪过程。
二、CLAHE涉及裁剪处理的关键源代码
裁剪处理在类 CLAHE_Impl的apply方法里调用CLAHE_CalcLut_Body类的函数对象来实现的,CLAHE_Impl是createCLAHE生成CLAHE实例时真正使用的类,而CLAHE_CalcLut_Body类是生成真正的直方图灰度映射和进行裁剪的类。涉及裁剪的代码在CLAHE_CalcLut_Body的operator函数中。相关的关键源代码如下:
template <class T, int histSize, int shift>
void CLAHE_CalcLut_Body<T,histSize,shift>::operator ()(const cv::Range& range) const
{
...
// clip histogram
if (clipLimit_ > 0)
{
// how many pixels were clipped
int clipped = 0;
for (int i = 0; i < histSize; ++i)
{
if (tileHist[i] > clipLimit_)
{
clipped += tileHist[i] - clipLimit_;
tileHist[i] = clipLimit_;
}
}
// redistribute clipped pixels
int redistBatch = clipped / histSize;
int residual = clipped - redistBatch * histSize;
for (int i = 0; i < histSize; ++i)
tileHist[i] += redistBatch;
if (residual != 0)
{
int residualStep = MAX(histSize / residual, 1);
for (int i = 0; i < histSize && residual > 0; i += residualStep, residual--)
tileHist[i]++;
}
}
...
}
}
三、代码解读
以上代码就是OpenCV自适应直方图均衡CLAHE直方图裁剪的对应源代码。上述代码中,tileHist为当前处理块的直方图分组数据,clipLimit_是《OpenCV自适应直方图均衡CLAHE的clipLimit的含义及理解》介绍的裁剪限制值,某个分组中的像素数超过这个限制值则需要裁剪。
具体裁剪处理时,对于直方图分组像素数超过clipLimit_的,则将该分组中超过clipLimit_的像素数累加到clipped局部变量中,然后将该直方图分组像素数强制设置为clipLimit_。
上述过程对当前块的所有分组都处理完成后,将超出后累加的clipped变量值按分组数平均分配到各分组中,如果存在不够平均分配的部分,则等间距按顺序插入到分组中,直到所有超出部分都分配到了对应分组。如直方图分组是256个,累加的clipped值是1027个,则先每个分组值加4,然后将剩余4个分别累加到第0、85、 170三个位置的直方图分组中。
四、小结
OpenCV自适应直方图均衡CLAHE中的参数clipLimit,是CLAHE的裁剪限制值,当图像的各分块图像的直方图分组的像素数据超过这个限制值就需要裁剪。裁剪时,将个分组中像素数超出限制值的强制值为限制值,并将所有分组中超出部分累加后平均分配到各分组。
更多图像直方图处理的内容请参考《《数字图像处理》第三章学习总结感悟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。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。