原理:首先将一幅图像分割成尺寸较小的小像素片,选定参考片后,寻找与参考片相似的小片组成 3D 块。此过程过后将得到 3D 块。然后将所有相似块进行 3D 变换。将变换后的 3D 块进行阈值收缩,这也是除去噪声的过程。然后进行 3D 逆变换。最后将所有的 3D 块通过加权平均后还原到图像中。
BM3D算法的大致流程:答族
第1步. 初始估计
(1)逐块估计。对含噪图像中的每一块
(i)分组。找到它的相似块然后把它们聚集到一个三维数组。
(ii)联合硬阈值。对形成的三维数组进行三维变换,通过对变换域的系数进行硬阈值处理减弱噪声,然后逆变换得到组中所有图像块的估计值,然后把这些估计值返回到他们的原始位置。
(2)聚集。对得到的有重叠的块估计,通过对他们进行衫举数加权平均得到真实图像的基础估计。
第2步. 最终估计
(1)逐块估计。对基础估计图像中的每一块
(i) 分组。通过块匹配找到与它相似的相似块在基础估计图像中的位置,通过这些位置得到两个三维数组,一个是从含噪图像中得到的,一个是从基础估计图像中得到的。
(ii)联合维纳滤波。对形成的两个三维数组均进行三维变换,以基础估计图像中的能量谱作为能量谱对含噪三维数组进行维纳滤波,然后逆变换得到组中所有图像块的估计,然后把这些估计值返回到他们的原始位置。
(2)聚集。对得到的有重叠的局部块估计,通过对他们进行加权平均得到真实图像的最终估计。
虽然你的分少,我还是给你写个完整的备指多功能程序供你学习:M=imread('dl011.jpg') %读取MATLAB中的名为cameraman的图像
subplot(3,3,1)
imshow(M) %显示原始图像
title('original')
P1=imnoise(M,'gaussian',0.02) %加入高斯躁声
subplot(3,3,2)
imshow(P1)%加仿态配入高斯躁声后显示图像
title('gaussian noise')
P2=imnoise(M,'salt &pepper',0.02) %加入椒盐躁声
subplot(3,3,3)
imshow(P2)%%加入椒盐躁声后显示图像
title('salt &pepper noise')
g=medfilt2(P1) %对高斯躁声中值滤波
subplot(3,3,5)
imshow(g)
title('medfilter gaussian')
h=medfilt2(P2) %对椒盐躁声中值闭橘滤波
subplot(3,3,6)
imshow(h)
title('medfilter salt &pepper noise')
l=[1 1 1 %对高斯躁声算术均值滤波
1 1 1
1 1 1]
l=l/9
k=conv2(P1,l)
subplot(3,3,8)
imshow(k,[])
title('arithmeticfilter gaussian')
%对椒盐躁声算术均值滤波
d=conv2(P2,l)
subplot(3,3,9)
imshow(d,[])
title('arithmeticfilter salt &pepper noise')
你是要用什么滤波器呢 ,我这里有一尘凯个程序,用均值和中值两种方法:g=imread('E:\1.jpg'锋兄薯银者) %读入图像的具体位置,
v=imnoise(g,'salt &pepper',0.1)
subplot(2,2,1)
imshow(g)
title('orginal image')
subplot(2,2,2)
imshow(v)
title('noise image')
[h,w]=size(v)
n=9
f=double(v)
a=ones(n,n)
y=f
for i=1:h-n+1
for j=1:w-n+1
a=f(i:i+(n-1),j:j+(n-1))
s=sum(sum(a))
y(i+(n-1)/2,j+(n-1)/2)=s/(n*n)
end
end
subplot(2,2,3)
imshow(uint8(y))
title('noise reduction by average filter')
x=f
for i=1:h-n+1
for j=1:w-n+1
c=f(i:i+(n-1),j:j+(n-1))
e=c(1,:)
for u=2:n
e=[e,c(u,:)]
end
mm=median(e)
x (i+(n-1)/2,j+(n-1)/2)=mm
end
end
subplot(2,2,4)
imshow(uint8(x))
title('noise reduction by median filter')
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)