非局部均值滤波算法(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

目录
相关文章
|
6月前
|
算法 计算机视觉
图像处理之积分图应用四(基于局部均值的图像二值化算法)
图像处理之积分图应用四(基于局部均值的图像二值化算法)
554 0
|
4月前
|
数据采集 资源调度 算法
【数据挖掘】十大算法之K-Means K均值聚类算法
K-Means聚类算法的基本介绍,包括算法步骤、损失函数、优缺点分析以及如何优化和改进算法的方法,还提到了几种改进的K-Means算法,如K-Means++和ISODATA算法。
151 4
|
5月前
|
算法
基于kalman滤波的UAV三维轨迹跟踪算法matlab仿真
本文介绍了一种使用卡尔曼滤波(Kalman Filter)对无人飞行器(UAV)在三维空间中的运动轨迹进行预测和估计的方法。该方法通过状态预测和观测更新两个关键步骤,实时估计UAV的位置和速度,进而生成三维轨迹。在MATLAB 2022a环境下验证了算法的有效性(参见附图)。核心程序实现了状态估计和误差协方差矩阵的更新,并通过调整参数优化滤波效果。该算法有助于提高轨迹跟踪精度和稳定性,适用于多种应用场景,例如航拍和物流运输等领域。
336 12
|
6月前
|
机器学习/深度学习 算法 数据挖掘
算法金 | K-均值、层次、DBSCAN聚类方法解析
**摘要:** 这篇文章介绍了聚类分析的基本概念和几种主要的聚类算法。聚类是无监督学习中用于发现数据内在结构的技术,常用于市场分析、图像分割等场景。K-均值是一种基于划分的算法,简单高效但易受初始值影响;层次聚类包括凝聚和分裂方式,形成层次结构但计算复杂;DBSCAN基于密度,能处理任意形状的簇,但参数选择敏感。文章还讨论了这些算法的优缺点和适用场景,并提供了相关资源链接和Python实现。
113 9
算法金 | K-均值、层次、DBSCAN聚类方法解析
|
4月前
|
算法 前端开发 计算机视觉
基于均值坐标(Mean-Value Coordinates)的图像融合算法的优化实现
基于均值坐标(Mean-Value Coordinates)的图像融合算法的优化实现
48 0
|
4月前
|
自然语言处理 并行计算 算法
基于均值坐标(Mean-Value Coordinates)的图像融合算法的具体实现
基于均值坐标(Mean-Value Coordinates)的图像融合算法的具体实现
50 0
|
5月前
|
机器学习/深度学习 运维 算法
Python基于局部离群因子LOF算法(LocalOutlierFactor)实现信用卡数据异常值检测项目实战
Python基于局部离群因子LOF算法(LocalOutlierFactor)实现信用卡数据异常值检测项目实战
|
5月前
|
机器学习/深度学习 算法 调度
|
6月前
|
传感器 算法 定位技术
技术心得记录:常用的滤波算法
技术心得记录:常用的滤波算法
49 0
|
16天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
下一篇
DataWorks