图像去噪、图像滤波
前言
在图像传输过程中,由于环境的干扰或者设备的限制,往往最终接收得到的图片带有很多噪声,图像变得很模糊等情况出现。
因此我们需要各种图像处理的方法来解决此问题,提高图像质量。这里讲一些传统图像处理的方法,我习惯讲图像去噪、滤波分为两类:空间域包括(均值滤波,中值滤波,二维统计滤波等等)与频率域(FFT去噪,小波去噪等等)。
本文主要介绍我个人常用的方法,两种类型各一个,非局部均值滤波(NLM)和离散余弦滤波(DCT)。
一、NLM
1.原理
非局部均值(NLM)是近年来提出的一项新型的去噪技术。该方法充分利用了图像中的冗余信息,在去噪的同时能最大程度地保持图像的细节特征,该算法需要在整个图像范围内判断像素间的相似度。为了解决效率问题,会设定两个固定大小的窗口:搜索窗口(D* D,D=2* Ds+1)和邻域窗口(d* d,d=2*ds+1)。在算法执行过程中,大窗口是以目标像素x为中心的搜索窗口,两个灰色小窗口分别是以x、y为中心的邻域窗口。其中以y为中心的邻域窗口在搜索窗口中滑动,通过计算两个邻域窗口间的相似程度为y赋以权值w(x,y)。
2.代码
关于这个NLM的代码,我也是从网上参考而来,直接作为分享:
function DenoisedImg=NLmeans(I,ds,Ds,h)
%I:含噪声图像
%ds:邻域窗口半径
%Ds:搜索窗口半径
%h:高斯函数平滑参数 滤波控制参数
%DenoisedImg:去噪图像
[m,n]=size(I);
DenoisedImg=zeros(m,n);
% 扩展图像边界
PaddedImg = padarray(I,[ds,ds],'symmetric','both');
% 定义d值
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;
% 在扩展图像中以(i1,j1)为中心的邻域窗口1
W1=PaddedImg(i1-ds:i1+ds,j1-ds:j1+ds);
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); % 搜索窗口右边界最高限制到原图像右边界
% r与s为搜索窗口内像素点的坐标,对搜索窗口内的每个像素点求相似度
for r=rmin:rmax
for s=smin:smax
% 不能与自己比较相似度
if(r==i1&&s==j1)
continue;
end
% 以搜索窗口内的像素点为中心的邻域窗口2
W2=PaddedImg(r-ds:r+ds,s-ds:s+ds);
% 计算邻域间距离
Dist2=sum(sum(kernel.*(W1-W2).*(W1-W2))); %距离平方和
% 计算权值w(x,y)
w=exp(-Dist2/h2); %像素点相似性权值
sweight=sweight+w;
average=average+w*PaddedImg(r,s);
end
end
% 将加权和归一化并替换原像素点
DenoisedImg(i,j)=average/sweight;
end
end
二、DCT
DCT变换的基础是傅里叶变换,图像信号需要通过二维数组的变换来实现。在对语音、图像信号变换的确定的变换矩阵正交变换中,DCT变换被认为是一种最佳变换。
1.公式
2.代码
通过DCT变换到频率域,进行高频屏蔽,去除图像中的部分噪声,其实这个方法用傅里叶变换和小波变换等也可以实现,欢迎大家尝试。
代码如下(示例):
%DCT变换
Y=dct2(Xnoised);
I=zeros(m,n);
%高频屏蔽
I(1:m/2,1:n/2)=1;
Ydct=Y.*I;
%逆DCT变换
Y=uint8(idct2(Ydct));
总结
以上就是今天要讲的内容,本文简单介绍了图像去噪的方法,NLM和DCT方法的具体细节和代码。希望大家一起来讨论。