时间:2024-07-28 来源:网络搜集 关于我们 0
今天详细介绍一下完整的CLAHE算法实现步骤与原理。
1、对比度和直方图均衡化
对比度衡量的是图像中明暗区域之间的差异,是影响图像视觉效果的重要因素。
对比度小的图像,色彩层次少,画面不够清晰,细节丢失,层次感差,如下图:
直方图均衡的本质是灰度值映射,这个映射函数可以由分布曲线(累积直方图CDF)得到:
其中 A0 是像素总数(图像宽乘以图像高),Dmax 是最大灰度值,DA是转换前的灰度值,DB是转换后的灰度值,Hi 是第 i 级灰度的像素个数, ∑Hi表示图像中从灰度级0到当前转换前灰度级的像素数目总和。
这里可以看下,原图像直方图统计与直方图均衡化后的图像直方图统计。
从图中可以看出,直方图均衡化的图像亮度分布更均匀。
2、直方图均衡化(HE)存在的噪声放大问题
简单的直方图均衡化,还是存在很多局限性问题,比如噪声放大。
如果原始图像中包含噪声,均衡化可能会放大这些噪声,因为噪声的亮度值可能会被放大。
比如一个噪声的亮度值为60,但直方图均衡化后可能就映射到100,这时噪声就被放大了。
3、自适应直方图均衡化
为了解决噪声放大和优化局部对比度问题,有学者提出了自适应直方图均衡化算法,请参考:
Karel Zuiderveld, “Contrast Limited Adaptive Histogram Equalization”, Graphics Gems IV, p. 474-485, code: p. 479-484
这个算法的主要思想就是:将图像被分割成一个矩形网格(块图像),每个块图像做直方图均衡化处理,一般分成8x8个块。
但这个自适应直方图均衡化,会有明显的块效应存在, 如下图:
4、限制对比度
在直方图均衡化之前,通过设置一个对比度限制值来实现的,该值定义了直方图均衡化过程中允许的最大对比度变化。
等效于将统计出来的直方图进行裁剪。
也就是说超过设定的最大幅值部分需要去掉,并同时将这部分超过最大幅值的数据量综合,再均分到整个灰度区间中,这样就能保证直方图统计的整个数据量不变。
实际上只处理一次裁剪,可能出现均分到整个灰度区间后,新的直方图还是有一些区间超过最大幅度值。
这就需要再次将超过的部分重新均分到整个灰度区间,需要循环反复处理,直至整个直方图统计结果不超过这个最大幅值。
5、插值算法
图像块效应的原因是因为每个块内的像素点只通过该块的映射函数做变化,而每个块的亮度分布又不一样,这就很容易出现明显的块效应。
为了解决这个问题,引入插值运算,一个像素点最终映射值,由这个像素点在相邻4个块的分别做映射后的灰度值,做加权双线性插值运算得到。
如下图所示,红色和紫色区域小块的宽高是block_w/2和block_h/2,可以看成是插值运算坐标做了偏移处理
但需要注意的是:
(1) 蓝色区域的像素,是以周边4个块的映射结果参与插值运算。
(2) 红色区域像素,也就是图像边界4个角,即block_w/2 和block_h/2的小块,直接映射到当前块。
(3)紫色区域像素,也就是图像上边界、下边界,以横向相邻的两个块,做映射插值; 图像的左边界、右边界,以竖向相邻的两个块做映射插值。
二、代码实现
完整的python代码和FPGA代码暂不公布。
有需要源码和学习FPGA图像处理的话,可以入手《FPGA图像处理实战专栏》,从简单到复杂,快速上手图像处理算法的实现。
如果需要更多学习资料和源码,想要学习FPGA实战入门进阶,请阅读下面这篇文章: