matlab怎么用小波包进行图像去噪

matlab怎么用小波包进行图像去噪,第1张

小波图像去噪的方法大概分为3类

1:基于小波变换摸极大值原理

2:基于小波变换系数的相关性

3:基于小波阈值的去噪。

基于小波阈值的去噪方法3个步骤:

1: 计算含噪声图像的小波变换。选择合适的小波基和小波分解层数J,运用Matlab 分解算法将含有噪声图像进行J层小波分解,得到相应的小波分解系数。

2:对分解后的高频系数进行阈值量化,对于从1 到J的每一层,选择一个适当的阈值和合适的阈值函数,将分解得到的高频系数进行阈值量化,得到估计小波系数。

3:进行小波逆变化,根据图像小波分解后的第J层,低频 系数(尺度系数)和经过阈值量化处理的各层高频系数(小波系数),运用Matlab重构算法进行小波重构,得到去噪后的图像。

程序是下面这样,但只能处理长宽一样的方形图像,灰度和彩色图像都可,要用其他图像只需把Lena.bmp改为其他图像,但图像要保存在m文件所在路径下。下面还有一个运行后的图像(之一),希望能对你有所帮助。

clearclc

%%%%%%%%%%测试图像只能是方形图像,长宽像素一样。

f=imread('Lena.bmp')%%读取图像数据,图像只能保存在m文件所在的路径下

d=size(f)

if length(d)>2

f=rgb2gray((f))%%%%%%%%如果是彩色图像则转化为灰度图

end

T=d(1)

SUB_T=T/2

% 2.进行二维小波分解

l=wfilters('db10','l') % db10(消失矩为10)低通分解滤波器冲击响应(长度为20)

L=T-length(l)

l_zeros=[l,zeros(1,L)] % 矩阵行数与输入图像一致,为2的整数幂

h=wfilters('db10','h') % db10(消失矩为10)高通分解滤波器冲击响应(长度为20)

h_zeros=[h,zeros(1,L)] % 矩阵行数与输入图像一致,为2的整数幂

for i=1:T % 列变换

row(1:SUB_T,i)=dyaddown( ifft( fft(l_zeros).*fft(f(:,i)') ) ).' % 圆周卷积<->FFT

row(SUB_T+1:T,i)=dyaddown( ifft( fft(h_zeros).*fft(f(:,i)') ) ).' % 圆周卷积<->FFT

end

for j=1:T % 行变换

line(j,1:SUB_T)=dyaddown( ifft( fft(l_zeros).*fft(row(j,:)) ) ) % 圆周卷积<->FFT

line(j,SUB_T+1:T)=dyaddown( ifft( fft(h_zeros).*fft(row(j,:)) ) ) % 圆周卷积<->FFT

end

decompose_pic=line % 分解矩阵

% 图像分为四块

lt_pic=decompose_pic(1:SUB_T,1:SUB_T) % 在矩阵左上方为低频分量--fi(x)*fi(y)

rt_pic=decompose_pic(1:SUB_T,SUB_T+1:T) % 矩阵右上为--fi(x)*psi(y)

lb_pic=decompose_pic(SUB_T+1:T,1:SUB_T) % 矩阵左下为--psi(x)*fi(y)

rb_pic=decompose_pic(SUB_T+1:T,SUB_T+1:T) % 右下方为高频分量--psi(x)*psi(y)

% 3.分解结果显示

figure(1)

subplot(2,1,1)

imshow(f,[]) % 原始图像

title('original pic')

subplot(2,1,2)

image(abs(decompose_pic)) % 分解后图像

title('decomposed pic')

figure(2)

% colormap(map)

subplot(2,2,1)

imshow(abs(lt_pic),[]) % 左上方为低频分量--fi(x)*fi(y)

title('\Phi(x)*\Phi(y)')

subplot(2,2,2)

imshow(abs(rt_pic),[]) % 矩阵右上为--fi(x)*psi(y)

title('\Phi(x)*\Psi(y)')

subplot(2,2,3)

imshow(abs(lb_pic),[]) % 矩阵左下为--psi(x)*fi(y)

title('\Psi(x)*\Phi(y)')

subplot(2,2,4)

imshow(abs(rb_pic),[]) % 右下方为高频分量--psi(x)*psi(y)

title('\Psi(x)*\Psi(y)')

% 5.重构源图像及结果显示

% construct_pic=decompose_matrix'*decompose_pic*decompose_matrix

l_re=l_zeros(end:-1:1) % 重构低通滤波

l_r=circshift(l_re',1)' % 位置调整

h_re=h_zeros(end:-1:1) % 重构高通滤波

h_r=circshift(h_re',1)' % 位置调整

top_pic=[lt_pic,rt_pic] % 图像上半部分

t=0

for i=1:T % 行插值低频

if (mod(i,2)==0)

topll(i,:)=top_pic(t,:)% 偶数行保持

else

t=t+1

topll(i,:)=zeros(1,T) % 奇数行为零

end

end

for i=1:T % 列变换

topcl_re(:,i)=ifft( fft(l_r).*fft(topll(:,i)') )' % 圆周卷积<->FFT

end

bottom_pic=[lb_pic,rb_pic] % 图像下半部分

t=0

for i=1:T % 行插值高频

if (mod(i,2)==0)

bottomlh(i,:)=bottom_pic(t,:) % 偶数行保持

else

bottomlh(i,:)=zeros(1,T) % 奇数行为零

t=t+1

end

end

这个只是一级分解,matlab自带的函数可以实现多级分解,级数由编程者自己确定。

是的,是一样的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7736511.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存