非局部均值滤波算法(NL-means)下

简介: 非局部均值滤波算法(NL-means)。非局部均值滤波算法最早于2005年由Buades等人发表在CVPR上,论文原文:A non-local algorithm for image denoising,还有一篇2011年的论文:Non-Local Means Denoising。之后还会继续介绍DCT(离散余弦变换滤波)、TV(全变分滤波)、BM3D(3维块匹配滤波)等算法。

理论上,该算法需要在整个图像范围内判断像素间的相似度,也就是说,每处理一个像素点时,都要计算它与图像中所有像素点间的相似度。但是考虑到效率问题,实现的时候,会设定两个固定大小的窗口:搜索窗(2*half_ssize+1)*(2*half_ssize+1)和邻域窗口(2*half_ksize+1)*(2*half_ksize+1)。邻域窗口在搜索窗口中滑动,根据邻域间的相似性确定像素的权值。

dc80a66619154f048a19c2430612d7e6.jpg

点A的滤波值由搜索窗口内所有点的像素值加权平均得到:

0d581e6942d54bbe80a04f29b39bccd7.png

上式中,w(A,B)为点A与搜索窗口中任意一点B的高斯权重,由两点各自邻域块的MSE相似度计算而得。如下式,w(A,B)需要除以搜索窗口内所有点的高斯系数之和,以实现归一化的目的。其中h也是一个重要的参数,h越大去噪效果越好,但是图像越模糊,反之h越小去噪效果越差,但去噪之后的失真度越小。

b845e12024544e1f9779a5523f25eded.jpg

代码实现类似均值+高斯滤波过程,即非局部均值滤波算法:

//sigma越大越平滑//halfKernelSize邻域窗//halfSearchSize搜索窗voidNL_mean(Matsrc, Mat&dst, doublesigma, inthalfKernelSize, inthalfSearchSize)
{
MatboardSrc;
dst.create(src.rows, src.cols, CV_8UC1);
intboardSize=halfKernelSize+halfSearchSize;
copyMakeBorder(src, boardSrc, boardSize, boardSize, boardSize, boardSize, BORDER_REFLECT);   //边界扩展doublesigma_square=sigma*sigma;
introws=src.rows;
intcols=src.cols;
cal_lookup_table1();
cal_lookup_table2();
for (intj=boardSize; j<boardSize+rows; j++)
  {
uchar*dst_p=dst.ptr<uchar>(j-boardSize);
for (inti=boardSize; i<boardSize+cols; i++)
    {
MatpatchA=boardSrc(Range(j-halfKernelSize, j+halfKernelSize), Range(i-halfKernelSize, i+halfKernelSize));
doublew=0;
doublep=0;
doublesumw=0;
for (intsr=-halfSearchSize; sr<=halfSearchSize; sr++)   //在搜索框内滑动      {
uchar*boardSrc_p=boardSrc.ptr<uchar>(j+sr);
for (intsc=-halfSearchSize; sc<=halfSearchSize; sc++)
        {
MatpatchB=boardSrc(Range(j+sr-halfKernelSize, j+sr+halfKernelSize), Range(i+sc-halfKernelSize, i+sc+halfKernelSize));
floatd2=MSE_block(patchA, patchB);
w=exp(-d2/sigma_square);
p+=boardSrc_p[i+sc] *w;
sumw+=w;
        }
      }
dst_p[i-boardSize] =saturate_cast<uchar>(p/sumw);
    }
  }
}
```主函数参数设置:标准差25,邻域窗2X2,搜索窗10X10```cppvoidmain()
{
Matsrc=imread("原图.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Matdst;
NL_mean(src, dst, 25, 2, 10);   //NL-meansimshow("原图", src);
imshow("非局部均值滤波", dst);
waitKey(0);
}

NL_means算法效果很好,但是运行速度较慢,需要对算法进行加速,下面还看到一种积分图加速的方法:

积分图加速本质是,将图像的所有点,计算某一偏离坐标点方向的权重,一次性计算出来,而不是单次计算某一点的所有偏离点。具体,计算当前图像与一定偏移后的图像的diff并平方,继而计算与原图像同等尺寸的积分图,则每一个点与偏离它在一定偏移的坐标点的距离,通过积分图就可以计算出来了。积分图的作用体现在使用线性计算,减少重复计算,即存储换时间。

MATLAB代码实现:

clc;
clearall;
closeall;
%---------------------------%%input%---------------------------%src=imread('lena.jpg');
src=rgb2gray(src);
src=double(src);
figure,imshow(src,[]),title('src image')
%---------------------------%%parameter%---------------------------%[m,n]=size(src);
ds=2;%blocksizeforcalculateweightDs=5;%searchblockh=10;%decayfactoroffset=ds+Ds;
PaddedImg=padarray(src,[ds+Ds,ds+Ds],'symmetric','both');%扩展图像,便于处理%---------------------------%%Non-LocalMeansDenoising%---------------------------%sumimage=zeros(m,n);
sumweight=zeros(m,n);
maxweight=zeros(m,n);
image=PaddedImg(1+Ds:Ds+m+ds,1+Ds:Ds+n+ds);
[M,N]=size(image);
forr=-Ds:Dsfors=-Ds:Ds%跳过当前点偏移if(r==0&&s==0)
continue;
end%求得差值积分图wimage=PaddedImg(1+Ds+r:Ds+m+ds+r,1+Ds+s:Ds+n+ds+s);
diff=image-wimage;
diff=diff.^2;
J=cumsum(diff,1);
J=cumsum(J,2);
%计算距离distance=J(M-m+1:M,N-n+1:N)+J(1:m,1:n)-J(M-m+1:M,1:n)-J(1:m,N-n+1:N);
distance=distance/((2*ds+1).^2);
%计算权重并获得单个偏移下的加权图像weight=exp(-distance./(h*h));
sumimage=sumimage+weight.*wimage(ds+1:ds+m,ds+1:ds+n);
sumweight=sumweight+weight;
maxweight=max(maxweight,weight);
endendsumimage=sumimage+maxweight.*image(ds+1:ds+m,ds+1:ds+n);
sumweight=sumweight+maxweight;
dst=sumimage./sumweight;
%---------------------------%%output%---------------------------%figure,imshow(dst,[]),title('dst');

效果图如下:

4c712c5428144ecc8cecdc3ce944e7a5.png

相关文章
|
26天前
|
机器学习/深度学习 算法 机器人
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
126 8
|
3月前
|
人工智能 算法 安全
【博士论文】基于局部中心量度的聚类算法研究(Matlab代码实现)
【博士论文】基于局部中心量度的聚类算法研究(Matlab代码实现)
125 0
|
4月前
|
监控 算法 决策智能
基于盲源分离与贝叶斯非局部均值的图像降噪算法
基于盲源分离与贝叶斯非局部均值的图像降噪算法
139 0
|
6月前
|
算法 数据处理 数据安全/隐私保护
基于投影滤波算法的rick合成地震波滤波matlab仿真
本课题基于MATLAB2022a实现对RICK合成地震波的滤波仿真,采用投影滤波与卷积滤波投影两种方法处理合成地震剖面。地震波滤波是地震勘探中的关键步骤,用于去噪和增强信号。RICK模型模拟实际地震数据,投影滤波算法通过分解信号与噪声子空间实现有效去噪。完整程序运行无水印,包含核心代码与理论推导,适用于地震数据处理研究及学习。
|
10月前
|
移动开发 算法 计算机视觉
基于分块贝叶斯非局部均值优化(OBNLM)的图像去噪算法matlab仿真
本项目基于分块贝叶斯非局部均值优化(OBNLM)算法实现图像去噪,使用MATLAB2022A进行仿真。通过调整块大小和窗口大小等参数,研究其对去噪效果的影响。OBNLM结合了经典NLM算法与贝叶斯统计理论,利用块匹配和概率模型优化相似块的加权融合,提高去噪效率和保真度。实验展示了不同参数设置下的去噪结果,验证了算法的有效性。
180 10
|
26天前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
155 0
|
1月前
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
126 2
|
2月前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
181 3
|
2月前
|
存储 编解码 算法
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
114 6
|
26天前
|
机器学习/深度学习 算法 自动驾驶
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
131 8

热门文章

最新文章