限制对比度自适应直方图均衡化(CLAHE)

🌟 在探索CLAHE的奥秘之前,让我们先了解一下直方图均衡化的基础知识。温馨提示:本文内容较为深入,建议准备好一杯咖啡慢慢阅读。

代码实现

📚 目录

  1. 直方图均衡化(HE)
  2. 自适应直方图均衡(AHE)
  3. 限制对比度自适应直方图均衡化(CLAHE)
  4. 补充说明

📊 直方图均衡化(HE)

直方图均衡化(Histogram Equalization)是一种增强图像对比度(Image Contrast)的方法。它的核心思想是将图像的直方图分布变成近似均匀分布,从而增强图像的对比度。

🧮 数学原理

考虑一个离散的灰度图像 { x } \{x\} {x},令 n i n_i ni 为灰度 i i i 的出现次数。图像中出现第 i i i 级像素的概率为:

p x ( i ) = n i n p_x(i) = \frac{n_i}{n} px(i)=nni

其中:

  • L L L 是图像中灰度的总数(通常为256)
  • n n n 是图像中像素的总数
  • p x ( i ) p_x(i) px(i) 实际上是像素值 i i i 的图像直方图,已标准化为 [0,1]

定义累积分布函数(CDF)为:

c d f x ( i ) = ∑ j = 0 i p x ( j ) cdf_x(i) = \sum_{j=0}^{i} p_x(j) cdfx(i)=j=0ipx(j)

我们想创建一个形式为 y = T ( x ) y = T(x) y=T(x) 的转换,以生成具有平坦直方图的新图像 { y } \{y\} {y}。这样的图像将在整个值范围内具有线性化的累积分布函数:

c d f y ( i ) = i ⋅ K cdf_y(i) = i \cdot K cdfy(i)=iK

对于某一常数 K K K。CDF 的属性允许我们执行这样的变换,它被定义为:

T ( x ) = c d f x ( x ) T(x) = cdf_x(x) T(x)=cdfx(x)

其中 k k k 在 [0, L] 范围内。注意,由于我们使用归一化的直方图 { x } \{x\} {x},因此 T T T 将级别映射到 [0,1] 范围内。为了将值映射回到其原始范围,需要对结果应用以下简单转换:

y ′ = y ⋅ ( m a x { x } − m i n { x } ) + m i n { x } y' = y \cdot (max\{x\} - min\{x\}) + min\{x\} y=y(max{x}min{x})+min{x}

🎯 通俗解释

简单来说,直方图均衡化就是:

  1. 遍历图像的像素统计出灰度值
  2. 计算累积分布函数(CDF)
  3. 将结果映射到 0~255 范围

💡 小贴士:这里我们主要讨论灰度图(单通道图)。对于彩色图像,可以:

  • 使用单独的直方图均衡化操作
  • 或者使用公式 Y = 0.2126 R + 0.7152 G + 0.0722 B Y = 0.2126R + 0.7152G + 0.0722B Y=0.2126R+0.7152G+0.0722B 将 RGB 图像转换为灰度图后再进行均衡化

对于单通道图,我们假设所示的8位灰度图像具有以下值:

下表中显示了该图像的直方图。为了简洁起见,将计数为零的像素值排除在外。

所述累积分布函数(CDF)如下所示。再次,为简洁起见,排除了不会增加cdf的像素值。

再通过此cdf显示子图像中的最小值为52,最大值为154。值154的cdf为64,与图像中的像素数一致。CDF必须标准化为[0,255]。直方图的一般均衡公式为:

h ( v ) = r o u n d ( c d f ( v ) − c d f m i n ( M × N ) − c d f m i n × ( L − 1 ) ) h(v) = round\left(\frac{cdf(v) - cdf_{min}}{(M \times N) - cdf_{min}} \times (L - 1)\right) h(v)=round((M×N)cdfmincdf(v)cdfmin×(L1))

其中cdf min是累积分布函数的最小非零值(在本例中为1),M×N给出图像的像素数(例如,在64以上的示例中,M为宽度,N为高度),L为使用的灰度级数(在大多数情况下为256)。请注意,要在原始数据中将大于0的值缩放到1到L-1(包括1和L-1)的范围,则上述公式将改为:

h ( v ) = r o u n d ( c d f ( v ) − 1 ( M × N ) − 1 × ( L − 1 ) ) h(v) = round\left(\frac{cdf(v) - 1}{(M \times N) - 1} \times (L - 1)\right) h(v)=round((M×N)1cdf(v)1×(L1))

其中cdf(v)>0。从1缩放到255保留最小值的非零值。示例比例数据从0到255(包括0和255)的均衡公式为:

h ( v ) = r o u n d ( c d f ( v ) − 1 63 × 255 ) h(v) = round\left(\frac{cdf(v) - 1}{63} \times 255\right) h(v)=round(63cdf(v)1×255)

例如,78的cdf为46。(第7列的下一行使用78的值。)标准化后的值变为:

h ( 78 ) = r o u n d ( 46 − 1 63 × 255 ) = r o u n d ( 0.714286 × 255 ) = 182 h(78) = round\left(\frac{46 - 1}{63} \times 255\right) = round(0.714286 \times 255) = 182 h(78)=round(63461×255)=round(0.714286×255)=182

🔄 自适应直方图均衡(AHE)

自适应直方图均衡(AHE)是普通直方图均衡化的升级版。它最大的特点是能够局部增强对比度,让图像的每个区域都得到适当的处理。

🎨 实现原理

  1. 将图片分割成多个块(例如 8×8 的块,无法整除可以补零)
  2. 对每个块分别计算累积分布函数
  3. 进行局部直方图均衡化

⚠️ 但是!AHE 有一个小缺点:它容易在图像的相对均匀区域中过度放大噪声。这主要是因为:

  1. 局部邻域越小,局部对比度越强
  2. 如果矩形区域内的图像块信息比较平坦,灰度接近,其灰度直方图呈尖状,在直方图均衡的过程中就可能会出现过度放大噪声的情况

🎯 限制对比度自适应直方图均衡化(CLAHE)

CLAHE 是 AHE 的改进版本,它通过限制对比度放大的方式来防止噪声过度放大。

🧠 核心原理

CLAHE 的实现主要包括 6 个步骤:

  1. 分块:将输入图像划分为大小相等的不重叠子块,每个子块含有的像素数为M。参考示例为8×8块。
  2. 计算子块直方图
  3. 计算剪切阈值 clipLimit(可以展开讨论,类似图像分割算法的大津法思想)
  4. 像素点重分配:对每个子块,使用步骤三中多余的像素重新分配
  5. 直方图均衡
  6. 像素点灰度值重构(源码中采用了双线性插值)

🔧 重要参数

CLAHE 的效果可以通过以下参数进行调整:

参数说明
窗口大小分割的块大小
块数裁剪的数量
CDF斜率限制强度传递函数中的对比度拉伸
直方图 bins 个数0~255 之间范围选取

📝 补充说明

在阅读 CLAHE 原始论文的作者之一 Karel Zuiderveld CLAHE的示例实现 时,我发现一个有趣的优化:作者通过增加双线性插值来减少代码时间复杂度。同时,插值运算及高斯平滑可以降低噪声产生。

🔗 相关参考

  1. 官方文档与实现

  2. 中文技术文章

  3. 英文参考资料

💡 小贴士:CLAHE 的参数调整需要根据具体应用场景来优化,没有放之四海而皆准的最佳参数组合。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

J先生x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值