如何使用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)则能增强更精细的局部细节。
阅读全文