clahe算法基本实现
一、背景介绍
图像算法处理中,经常需要遇到图像对比度调整的情况,CLAHE(Contrast Limited Adaptive Histogram Equalization)则是一种基于直方图,使用非常普遍的图像对比度调整算法。
关于这个算法的介绍有很多,基本原理这些,我就不做过多讲解了,可以参考如下这些文章:
刘斯宁:Image Enhancement - CLAHE 基本原理讲解
CLAHE的实现和研究-阿里云开发者社区 实现代码讲解
二、实现流程
1、输入图像进行图像分块,块分得越细,图像对比度调整效果相对越好,但副作用也越明显。
2、统计每个块的图像直方图信息,并生成均衡化直方图H。
3、根据设置的限制参数强度,对直方图信息进行重新分配:
a、设置一个阈值T,将均衡化后直方图,从H[0]到H[255]上依此遍历,把大于阈值T的都全部减去,并统计一共减去了多少像素sub_pixel。
b、计算mean_pixel = sub_pixel / 256,然后将H[0]到H[255]上,都全部加上mean_pixel的值。
比如T=3000, H[0]=500,H[128]=20000,计算后mean_pixel=346。
那个根据调整,第一步时候H[0]保持不变,H[128]被强行截断为3000;第二步时候,H[0]=846, H[128]=3346,通过这种方式将均衡化后直方图进行了重新分配,避免了直方图部分区域聚集的像素值太多,导致最终均衡化后图像对比度特别大和亮度变化特别严重的情况。
调整前和调整后直方图对比,可以参考如下图所示:
因此容易理解到:阈值T的设置对算法效果影响较大,当T足够小的时候,算法结果和原图一模一样,当T足够大的时候,算法结果和直方图均衡化一模一样。
三、代码实现
1、效果演示
左边为输入图,右边为结果图像:
从上面图像上也可以看到,Clahe算法也存在很多明显缺陷:
1、局域块效应(局域块异常亮或者黑,即便使用了插值,依然和周围过度不太自然)
2、结果图像噪声放大。
3、结果图像相对于输入,整体亮度出现明显变化等。
为了改善这些缺陷,也引申出了很多相关的优化算法,比如局域块选择自适应的的阈值T,局域直方图和全局直方图融合,局域直方图和邻域直方图融合等
2、复现代码
文章:CLAHE的实现和研究-阿里云开发者社区 提供了完整的代码实现的,我这里在他基础上做了点稍微整理,方便归档笔记:ImageQualityEnhancement/ltm/clahe at master · yulinghan/ImageQualityEnhancement · GitHub