原理:首先将一幅图像分割成尺寸较小的小像素片,选定参考片后,寻找与参考片相似的小片组成 3D 块。此过程过后将得到 3D 块。然后将所有相似块进行 3D 变换。将变换后的 3D 块进行阈值收缩,这也是除去噪声的过程。然后进行 3D 逆变换。最后将所有的 3D 块通过加权平均后还原到图像中。
BM3D算法的大致流程:答族
第1步. 初始估计
(1)逐块估计。对含噪图像中的每一块
(i)分组。找到它的相似块然后把它们聚集到一个三维数组。
(ii)联合硬阈值。对形成的三维数组进行三维变换,通过对变换域的系数进行硬阈值处理减弱噪声,然后逆变换得到组中所有图像块的估计值,然后把这些估计值返回到他们的原始位置。
(2)聚集。对得到的有重叠的块估计,通过对他们进行衫举数加权平均得到真实图像的基础估计。
第2步. 最终估计
(1)逐块估计。对基础估计图像中的每一块
(i) 分组。通过块匹配找到与它相似的相似块在基础估计图像中的位置,通过这些位置得到两个三维数组,一个是从含噪图像中得到的,一个是从基础估计图像中得到的。
(ii)联合维纳滤波。对形成的两个三维数组均进行三维变换,以基础估计图像中的能量谱作为能量谱对含噪三维数组进行维纳滤波,然后逆变换得到组中所有图像块的估计,然后把这些估计值返回到他们的原始位置。
(2)聚集。对得到的有重叠的局部块估计,通过对他们进行加权平均得到真实图像的最终估计。
X = imread('lena.bmp') % 装载原始图像subplot(131) % 新建窗口
imshow(X) % 显示图像
title('原始图像') % 设置图像标题
%生成含噪图像
init=2055615866 % 初始值
randn('seed',init) % 随机值
XX=double(X)+15*randn(size(X)) % 添加随机噪声
subplot(132) % 新建窗口
imshow(uint8(XX)) % 显示图像
title('含噪图像') % 设置图像标题
%用小波函数coif2 对图像XX 进行2 层分解
[c,l]=wavedec2(XX,2,'coif2') % 分解
n=[1,2] % 掘漏设置尺度向量
p=[80,80] % 设置阈值向量悔散局,对高频小波系数进行阈值处理
nc=wthcoef2('d',c,l,n,p,'s')
X1=waverec2(nc,l,'coif2') % 图像的二维小波重构
subplot(133) % 碧让新建窗口
imshow(uint8(X1)) % 显示图像
title('消噪后的图像') % 设置图像标题
你是要用什么滤波器呢 ,我这里有一尘凯个程序,用均值和中值两种方法: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条)