
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自带的函数可以实现多级分解,级数由编程者自己确定。
是的,是一样的。
[c l]=wavedec(x,5,'db6') %%%x是要分析的数据%%%d1=wrcoef('d',c,l,'db6',1)
d2=wrcoef('d',c,l,'db6',2)
d3=wrcoef('d',c,l,'db6'斗颂坦,3)
d4=wrcoef('d',c,l,'db6',4)
d5=wrcoef('d',c,l,'db6',5)
a5=wrcoef('a',c,l,'db6',5)
plot(d1) %%%输樱拦出d1的图像
合空桐并的话,直接用x1=a5+d5+d4+d3就可以吧
%用于提升变换 --若血残阳%TransImage.m 输入参数为图像文件贺蠢李的路径加文件名
function TransImage(filename)
f=imread(filename)
f=im2double(f) %将矩阵转化成double型
A=-1.586134342 %提升系数
B=-0.052980118
R=0.882911075
D=0.443506852
K=1.230174105
[m_orgHeight m_orgWidth]=size(f)
h=ones(m_orgHeight,m_orgWidth)
h=im2double(h)
h=h.*128
%第一次列提升开始------------------------------------------------------------------------------------------
f=im2double(f-h)%将矩阵的每个元素减128向直流靠近--
for i=2:2:(m_orgWidth-2) %偶数列提升(C++奇数角标列)
f(:,i)=f(:,i)+A*[f(:,i-1)+f(:,i+1)]
end
f(:,m_orgWidth)=f(:,m_orgWidth)+2*A*f(:,m_orgWidth-1)%最后一列用前一列的2倍来预测
for i=3:2:(m_orgWidth-1)%奇数列提升(C++偶数角标列)
f(:,i)=f(:,i)+B*[f(:,i-1)+f(:,i+1)]
end
f(:,1)=f(:,1)+2*B*f(:,2) %第一列用第二列的2倍来预测
%第一次列提升完毕--------------------------------------------------------------------------------------------
%第二次列提升开始--------------------------------------------------------------------------------------------
for i=2:2:(m_orgWidth-2) %偶数列提升
f(:,i)=f(:,i)+R*[f(:,i-1)+f(:,i+1)]
end
f(:,m_orgWidth)=f(:,m_orgWidth)+2*R*f(:,m_orgWidth-1)
for i=3:2:(m_orgWidth-1) %奇数列提升
f(:,i)=f(:,i)+D*[f(:,i-1)+f(:,i+1)]
end
f(:,1)=f(:,1)+2*D*f(:,2)
%第二次列提升完毕-------------------------------------------------------------------------------------------
for i=1:2:(m_orgWidth-1)%调整起奇、偶列值
f(:,i+1)=f(:,i+1)*(-K) %偶数列(C++奇数角标)
f(:,i)=f(:,i)/K %奇数列(C++偶数禅迟角标)
end
%第一次行提升档乱开始------------------------------------------------------------------------------------------
for i=2:2:(m_orgHeight-2)
f(i,:)=f(i,:)+A*[f(i-1,:)+f(i+1,:)]
end
f(m_orgHeight,:)=f(m_orgHeight,:)+2*A*f(m_orgHeight-1,:)
for i=3:2:(m_orgHeight-1)
f(i,:)=f(i,:)+B*[f(i-1,:)+f(i+1,:)]
end
f(1,:)=f(1,:)+2*B*f(2,:)
%第一次行提升完毕------------------------------------------------------------------------------------------
%第二次行提升开始------------------------------------------------------------------------------------------
for i=2:2:(m_orgHeight-2)
f(i,:)=f(i,:)+R*[f(i-1,:)+f(i+1,:)]
end
f(m_orgHeight,:)=f(m_orgHeight,:)+2*R*f(m_orgHeight-1,:)
for i=3:2:(m_orgHeight-1)
f(i,:)=f(i,:)+D*[f(i-1,:)+f(i+1,:)]
end
f(1,:)=f(1,:)+2*D*f(2,:)
%第二次行提升完毕------------------------------------------------------------------------------------------
for i=1:2:(m_orgHeight-1) %调整奇、偶行值
f(i+1,:)=f(i+1,:)*(-K)%偶数行(C++奇数角标)
f(i,:)=f(i,:)/K%奇数行(C++偶数角标)
end
for i=1:2:(m_orgWidth-1) %把f的奇数列(C语言中的偶数列[角标])存放到h的前半部分
h(:,(i+1)/2)=f(:,i)
end
for i=2:2:m_orgWidth %把f的偶数列(c语言中的奇数列[角标])存放到h的后半部分
h(:,m_orgWidth/2+i/2)=f(:,i)
end
for i=1:2:(m_orgHeight-1) %把h的奇数行(c语言中的偶数行[角标])存放到f的上半部分
f((i+1)/2,:)=h(i,:)
end
for i=2:2:m_orgHeight %把h的偶数行 (c语言中的奇数行[角标])存放到f的下半部分
f(m_orgHeight/2+i/2,:)=h(i,:)
end
f=f.*(-10)%为看清楚高频部分 给矩阵每个元素同时乘以(-10)
h=ones(m_orgHeight/2,m_orgWidth/2) %定义与低频子带阶数相同的“1”阵
h=im2double(h)%将上述阵变换为double型
h=h.*128 %给阵的每个元素乘以128(估计是开始减去的128)
f(1:m_orgHeight/2,1:m_orgWidth/2)=f(1:m_orgHeight/2,1:m_orgWidth/2)./(-10)+h %给低频部分除以(-10)返回原来值,在加上“128”阵,看清楚低频轮廓
imshow(f) %显示变换后图片
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)