如何使用OpenCVSharp实现对比度受限自适应直方图均衡化(CLAHE)?
摘要:CLAHE介绍 CLAHE(Contrast Limited Adaptive Histogram Equalization)对比度受限自适应直方图均衡化我们可以分三部分来理解。 第一个部分HE (Histogram Equalizatio
CLAHE介绍
CLAHE(Contrast Limited Adaptive Histogram Equalization)对比度受限自适应直方图均衡化我们可以分三部分来理解。
第一个部分HE (Histogram Equalization) - 直方图均衡化
图像的直方图显示了每个像素亮度值的分布情况,直方图均衡化的思想是:把像素的亮度值重新分配,让它们尽可能地均匀分布在整个亮度范围(0-255)内。
这个操作有什么缺点呢?
它是全局操作,会一视同仁,如果图像中某个区域已经很亮,它会被过度增强,导致细节丢失。
这时候第二部分就来了。
第二部分A (Adaptive) - 自适应
核心思想: 不再对整张图进行处理,而是将图像分成很多个小格子(比如 8x8 的小块),然后对每一个小块单独进行直方图均衡化。
这样就能针对每个小区域的特性来增强对比度。一个暗的区域不会被旁边亮的区域影响,即使在同一张图里,也能同时看清暗处和亮处的细节。
虽然解决了全局问题,但它放大噪声的问题变得更严重了。因为噪声本身就是局部像素的剧烈变化,AHE 会在每个小格子里拼命放大这种变化,导致图像出现“块状”的伪影,噪点满天飞。
这时候第三部分就来了。
第三部分CL (Contrast Limited) - 对比度受限
核心思想: 限制每个小格子里直方图的高度,也就是限制某个亮度值能出现的最大像素数量(即对比度增强的上限)。
这样看还是有点不清楚,让我们结合效果与代码去更好地理解吧!!
效果:
会发现暗的地方更清楚了一点。
这个算法包含ClipLimit与GridSize两个参数。
实践
在OpenCVSharp中使用CLAHE算法非常简单:
// 灰度图像:直接应用CLAHE
using var clahe = Cv2.CreateCLAHE();
clahe.ClipLimit = ClipLimit;
clahe.TilesGridSize = new Size(TilesGridSize, TilesGridSize);
clahe.Apply(src, dst);
public static CLAHE CreateCLAHE(double clipLimit = 40.0, Size? tileGridSize = null)
{
return CLAHE.Create(clipLimit, tileGridSize);
}
参数解释:
参数
含义
clipLimit
对比度限制。控制对比度增强的强度。值大则效果强但易放大噪声,值小则效果温和能抑制噪声。
tileGridSize
局部区域大小。定义算法作用的范围。值大(如32x32)则效果偏全局,值小(如4x4)则能增强更精细的局部细节。
