非局部均值滤波算法解析:从Buades-Coll-Morel论文到图像降噪实战

1次阅读
没有评论

共计 1718 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

背景痛点:为什么需要 NL-means?

传统图像降噪方法如高斯滤波和中值滤波,本质都是基于局部邻域的像素加权平均。虽然能有效抑制噪声,但不可避免地会导致边缘和纹理模糊:

非局部均值滤波算法解析:从 Buades-Coll-Morel 论文到图像降噪实战

  • 高斯滤波 :权重仅取决于几何距离,忽略像素间的结构关系
  • 中值滤波 :对椒盐噪声有效,但会破坏细密纹理

Buades 等人发现:自然图像中存在大量自相似结构(如重复的窗格、砖墙纹理)。NL-means 的创新在于——利用整张图像的相似块进行加权平均,数学表达为:

$$w(i,j)=\exp\left(-\frac{|v(N_i)-v(N_j)|^2}{h^2}\right)$$

其中 $N_i$ 表示以像素 $i$ 为中心的图像块,$h$ 控制衰减速度。

算法对比:局部均值 vs 非局部均值

局部均值滤波(公式 1)
$$u(i) = \sum_{j\in\Omega_i} w(j)v(j)$$
– $\Omega_i$:固定大小的邻域窗口
– $w(j)$:仅与位置相关(如高斯核)

NL-means(公式 2)
$$u(i) = \frac{1}{Z(i)}\sum_{j\in I} w(i,j)v(j)$$
– 搜索范围 $I$:整张图像
– 权重 $w(i,j)$:由相似度决定(见前文公式)
– $Z(i)$:归一化因子

核心实现三步走

1. 相似块搜索

def find_similar_patches(image, center_patch, search_window=21, patch_size=7):
    """
    :param center_patch: 参考图像块 (patch_size x patch_size)
    :param search_window: 搜索范围边长 (奇数)
    :return: 相似块坐标列表
    """
    # 计算所有块的 SSD 距离(实际可用积分图加速)distances = sliding_window_ssd(image, center_patch, patch_size)
    # 返回前 K 个最相似块位置
    return np.argsort(distances)[:K]

时间复杂度:$O(N \cdot S^2)$,$N$ 为像素数,$S$ 为搜索窗口边长

2. 权重计算

def compute_weights(target_patch, candidate_patches, h=10):
    """
    :param h: 滤波参数,控制权重衰减速度
    :return: 归一化权重数组
    """
    diff = target_patch - candidate_patches  # 块差异
    distances = np.sum(diff**2, axis=(1,2))  # SSD 距离
    weights = np.exp(-distances/(h**2))      # 指数权重
    return weights / np.sum(weights)         # 归一化 

3. 像素重构

def reconstruct_pixel(weights, candidate_pixels):
    return np.sum(weights * candidate_pixels)

OpenCV 实战技巧

import cv2
denoisied = cv2.fastNlMeansDenoising(
    src=noisy_img,
    h=15,                  # 关键参数:值越大降噪越强(但会更模糊)templateWindowSize=7,   # 相似块大小(奇数)searchWindowSize=21     # 搜索范围(奇数))

调参经验
– 对于轻度噪声(如 sigma=10),建议 h =10~15
– 医疗 CT 影像:适当增大 templateWindowSize(如 9×9)
– 实时处理:减小 searchWindowSize 至 15×15

性能优化方案

  1. 积分图加速 :预计算 SSD 可减少重复运算
  2. GPU 并行化 :每个像素的权重计算相互独立
  3. 降采样策略 :先处理低分辨率图像,再上采样细化

避坑指南

  1. 过度降噪导致纹理丢失
  2. 现象:木纹、织物纹理变平坦
  3. 解决:减小 h 参数,或采用自适应 h 值

  4. 边缘出现伪影

  5. 现象:建筑物边缘产生光晕
  6. 解决:限制搜索窗口方向(避免跨边缘搜索)

  7. 处理速度过慢

  8. 现象:4K 图像处理超 30 秒
  9. 解决:改用 fastNlMeansDenoisingColored(针对彩色图像优化)

思考题

如何改进 NL-means 使其适应脉冲噪声场景?提示:可以考虑结合中值滤波的鲁棒性特点。

正文完
 0
评论(没有评论)