NL-Means

非局部均值去噪算法详解
本文详细介绍了非局部均值(NL-means)去噪算法的实现过程,通过MATLAB代码展示了如何对图像进行去噪处理。该算法基于像素间的相似度,使用高斯函数作为权重,对邻域和搜索窗口内的像素进行加权平均,从而达到去噪效果。

function DenoisedImg=NLmeans(I,ds,Ds,h)

%此程序是对单个像素做非局部去噪,并非块,

%当目标像素扩展的块与搜索到的块近似时认为搜索到的像素与目标像素相近,权重大

%I:含噪声图像

%ds:邻域窗口半径

%Ds:搜索窗口半径

%h:高斯函数平滑参数

%DenoisedImg:去噪图像

I=double(I);

[m,n]=size(I);

DenoisedImg=zeros(m,n);

PaddedImg = padarray(I,[ds,ds],'symmetric','both');

kernel=ones(2*ds+1,2*ds+1);

kernel=kernel./((2*ds+1)*(2*ds+1));

h2=h*h;

for i=1:m    %整幅图像挨着取

    for j=1:n

        i1=i+ds;

        j1=j+ds;

        W1=PaddedImg(i1-ds:i1+ds,j1-ds:j1+ds);%邻域窗口1

        wmax=0;

        average=0;

        sweight=0;

        %%搜索窗口

        rmin = max(i1-Ds,ds+1);

        rmax = min(i1+Ds,m+ds);

        smin = max(j1-Ds,ds+1);

        smax = min(j1+Ds,n+ds);

        for r=rmin:rmax

            for s=smin:smax

                if(r==i1&&s==j1)

                continue;

                end

                W2=PaddedImg(r-ds:r+ds,s-ds:s+ds);%邻域窗口2

                Dist2=sum(sum(kernel.*(W1-W2).*(W1-W2)));%邻域间距离

                w=exp(-Dist2/h2);  %距离越大,w越小

                if(w>wmax)

                    wmax=w;

                end

                sweight=sweight+w;%权重归一

                average=average+w*PaddedImg(r,s);%

            end

        end

        average=average+wmax*PaddedImg(i1,j1);%自身取最大权值

        sweight=sweight+wmax;

        DenoisedImg(i,j)=average/sweight;

    end

end

 

 

这里边有作者的笔记:https://blog.youkuaiyun.com/wxz1120171495/article/details/81488863

代码与这个相同:https://blog.youkuaiyun.com/u010839382/article/details/48229579

### 原理 NL - Means即Non - Local Means,直译为非局部平均,于2005年由Baudes提出,该算法利用自然图像中普遍存在的冗余信息进行去噪,与常用的双线性滤波、中值滤波等利用图像局部信息滤波不同,它利用整幅图像去噪,以图像块为单位在图像中寻找相似区域,再对这些区域求平均,能较好地去除图像中的高斯噪声。其滤波过程可用公式 $\tilde{u}(x)=\sum_{y\in\Omega_x}w(x,y)v(y)$ 表示 [^1]。 非局部均值滤波的核心思路与高斯滤波相似,都是计算矩形窗口内所有像素点的像素值加权和,权重服从高斯分布。但二者计算权重的依据不同,高斯滤波使用当前滤波点与矩形窗口内其它点的空间欧式距离来计算权重,距离越近权重越大;而非局部均值滤波使用当前滤波点的邻域块与矩形窗口内其它点的邻域块的相似度来计算权重,相似度越大则权重越大 [^3]。 ### 应用 NL - Means算法主要应用于图像去噪领域,能够有效去除图像中的高斯噪声,恢复图像的真实信息,提升图像质量。 ### 实现 在实现方面,NL - Means算法可通过编程实现其核心逻辑,根据公式计算每个像素点的滤波后的值。在2014年,还出现了NLM衍生算法NLMP,该算法来自论文“Parameter - Free Fast Pixelwise Non - Local Means Denoising”,且具有快速和开源的特点 [^2]。 以下是一个简单的Python伪代码示例,用于说明NL - Means的大致实现思路: ```python import numpy as np def nl_means(image, patch_size, search_window, h): height, width = image.shape denoised_image = np.zeros((height, width)) for i in range(height): for j in range(width): # 获取当前像素点的邻域块 patch_i = get_patch(image, i, j, patch_size) weights = [] values = [] # 在搜索窗口内遍历其他像素点 for m in range(max(0, i - search_window), min(height, i + search_window)): for n in range(max(0, j - search_window), min(width, j + search_window)): # 获取其他像素点的邻域块 patch_mn = get_patch(image, m, n, patch_size) # 计算相似度 similarity = np.exp(-np.sum((patch_i - patch_mn) ** 2) / (h ** 2)) weights.append(similarity) values.append(image[m, n]) # 归一化权重 weights = np.array(weights) weights = weights / np.sum(weights) # 计算加权和 denoised_image[i, j] = np.sum(weights * np.array(values)) return denoised_image def get_patch(image, i, j, patch_size): half_patch = patch_size // 2 height, width = image.shape patch = image[max(0, i - half_patch):min(height, i + half_patch + 1), max(0, j - half_patch):min(width, j + half_patch + 1)] return patch ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值