matlab小波变换程序
Ⅰ 求matlab小波变换图像处理实现程序~
把图像发过来,我帮你处理。
Ⅱ 泪求matlab 离散二维小波变换的程序
程序是下面这样,但只能处理长宽一样的方形图像,灰度和彩色图像都可,要用其他图像只需把Lena.bmp改为其他图像,但图像要保存在m文件所在路径下。下面还有一个运行后的图像(之一),希望能对你有所帮助。
clear;clc;
%%%%%%%%%%测试图像只能是方形图像,长宽像素一样。
f=imread('Lena.bmp');%%读取图像数据,图像只能保存在m文件所在的路径下
d=size(f);
iflength(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的整数幂
fori=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;
forj=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('originalpic');
subplot(2,1,2);
image(abs(decompose_pic));%分解后图像
title('decomposedpic');
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;
fori=1:T;%行插值低频
if(mod(i,2)==0)
topll(i,:)=top_pic(t,:);%偶数行保持
else
t=t+1;
topll(i,:)=zeros(1,T);%奇数行为零
end
end;
fori=1:T;%列变换
topcl_re(:,i)=ifft(fft(l_r).*fft(topll(:,i)'))';%圆周卷积<->FFT
end;
bottom_pic=[lb_pic,rb_pic];%图像下半部分
t=0;
fori=1:T;%行插值高频
if(mod(i,2)==0)
bottomlh(i,:)=bottom_pic(t,:);%偶数行保持
else
bottomlh(i,:)=zeros(1,T);%奇数行为零
t=t+1;
end
end
这个只是一级分解,matlab自带的函数可以实现多级分解,级数由编程者自己确定。
是的,是一样的。
Ⅲ 求matlab的Morlet小波变换代码……谢谢。需要得到如下结果图。
小波分析后,你也没处理,组合起来依然是原信号啊。方差不会变的。你用连续小波变换,得到了1:43尺度下的小波基系数组z(i)。如果你指的是在一定分辨率下,该信号在某个尺度上投射的分量的方差。就用z(i)乘以这个小波φ(τ,σ)基。在用STD求方差呗。
Ⅳ 关于小波变换的Matlab编程
这是一个带参数的函数 根据下面的参数校验可以看出你应该是直接点运行了吧 所以报错了
你至少应该产生一个输入信号,比如一个正弦信号来做输入进行变换
。。。谁给你的程序啊 这bug也太多了 很多低级bug 我只是改的能运行了
function [WT,FreqBins,Scales]=CWT_Morlet(Sig,WinLen,nLevel)
%continuous Wavelet Transform using Morlet function
%Sig:信号
%WinLen:小波函数在尺度参数a=1时的长度(默认为10)
%nLevel:频率轴划分区间段(默认为1024)
%
%WT:返回的小波变换计算结果
%FreqBins:返回频率轴划分结果(归一化频率,最高频率为0.5)
%Scales:返回与频率轴划分值相对应的尺度划分(频率0.5对应的尺度为1)
if (nargin==0),
error('At least 1 parameter required!');
end;
if (nargin<3),
nLevel=1024;
end
if (nargin<2),
WinLen=10;
end
Sig=hilbert(real(Sig));%计算信号的解析信号
SigLen=length(Sig);%获取信号的长度
fmax=0.5;%设置最高分析频率
fmin=0.005;%设置最低分析频率
FreqBins=logspace(log10(fmin),log10(0.5),nLevel);%将频率轴在分析范围内等
%对数坐标划分
Scales=fmax*ones(size(FreqBins))./FreqBins;%计算响应的尺度参数
omg0=WinLen/6;
WT=zeros(nLevel,SigLen);%分配计算结果的存储单元
wait=waitbar(0,'Under calculation,please wait');
for m=1:nLevel,
waitbar(m/nLevel,wait);
a=Scales(m);%提取尺度参数
t=-round(a*WinLen):1:round(a*WinLen);
Mor1=pi^(-1/4)*exp(1i*2*pi*0.5*t/a).*exp(-t.^2/2/(2*omg0*a)^2);
%计算当前尺度下的小波函数
temp=conv(Sig,Mor1)/sqrt(a); %计算信号与小波函数的卷积
WT(m,:)=temp(round(a*WinLen)+1:length(temp)-round(a*WinLen));
end;
close(wait);
WT=WT/WinLen;
%%%%%%运行示例%%%%%%%%%
Fs=100;
t=0:1/Fs:2*pi;
sig=sin(t);
[WT,FreqBins,Scales]=CWT_Morlet(sig);
Ⅳ 怎样用MATLAB程序实现小波变换
[YC,YS]=wavedec2(Y,2,'db1');
Y为要分解的图像矩阵,2为分解的层数,‘db1'为采用的小波基
返回两个矩阵YC和YS。Yh2=detcoef2('h',YC,YS,2);这是提取出图像2层分解后的水平分量,h改v是垂直分量,h该d是对角分量。细节分量用另外一个方法提取。
Ⅵ 离散小波变换matlab程序
小波变换图象粒子聚焦matlab程序
http://www.google.cn/search?hl=zh-cn&rlz=1i7gzaz_zh-cn&newwindow=1&ei=8iubsozuczwvkawewvgudw&sa=x&oi=spell&resnum=0&ct=result&cd=1&q=%e5%b0%8f%e6%b3%a2%e5%8f%98%e6%8d%a2%e5%9b%be%e5%83%8f%e7%b2%92%e5%ad%90%e8%81%9a%e7%84%a6matlab%e7%a8%8b%e5%ba%8f&spell=1
希望对你有用
Ⅶ 用MATLAB 进行整数小波分解的程序,最好有程序详细介绍的,谢谢!
举个例子,希望有所帮助。clc;clearall;closeall;X=rgb2gray(imread('lena.jpg'));x=X;x=double(x);line=250;column=250;J=6;Tu=7;smooth_area_num=20;edge_area_num=40;fori=1:linecoef1(i,:)=cwt(x(i,:),1,'bior4.4');coef2(i,:)=cwt(x(i,:),2,'bior4.4');coef3(i,:)=cwt(x(i,:),J,'bior4.4');endmax=0;max_loc=0;max_num=15;fori=1:linej=1;whilej0&coef3(i,j+1)0)%找到左位置jfork=j+1:column-1ifcoef3(i,k)*coef3(i,j)>=0%找到右位置kform=j:kifabs(coef3(i,m))>maxmax=abs(coef3(i,m));max_loc=m;endendifmax>max_numform(i,max_loc)=1;endj=k;max=0;break;endend%forkifk==column-1j=column-1;endelsej=j+1;end%ifend%whileend%对列作小波变换x=x';fori=1:linecoef1(i,:)=cwt(x(i,:),1,'bior4.4');coef2(i,:)=cwt(x(i,:),2,'bior4.4');coef3(i,:)=cwt(x(i,:),J,'bior4.4');end%正值1,负值0的矩阵temp表示(突变点左位置)max=0;max_loc=0;fori=1:linej=1;whilej0&coef3(i,j+1)0)%找到左位置jfork=j+1:column-1ifcoef3(i,k)*coef3(i,j)>=0%找到右位置kform=j:kifabs(coef3(i,m))>maxmax=abs(coef3(i,m));max_loc=m;endendifmax>max_numform(max_loc,i)=1;endj=k;max=0;break;endend%forkifk==column-1j=column-1;endelsej=j+1;end%ifend%whileendfori=2:line-2forj=2:column-2%链长为1ifform(i,j-1)==0&form(i,j+1)==0&form(i-1,j-1)==0&form(i-1,j)==0&form(i-1,j+1)==0&form(i+1,j-1)==0&form(i+1,j)==0&form(i+1,j+1)==0form(i,j)=0;%endifform(i,j)==1&form(i,j+1)==1&sum(sum(form(i-1:i+1,j-1:j+2)))==2form(i,j)=0;form(i,j+1)=0;endifform(i,j)==1&form(i+1,j)==1&sum(sum(form(i-1:i+2,j-1:j+1)))==2form(i,j)=0;form(i+1,j)=0;endifform(i,j)==1&form(i+1,j+1)==1&sum(sum(form(i:i+1,j:j+1)))==2ifsum(sum(form(i-1:i+2,j-1:j+2)))==3&(form(i-1,j+2)==1|form(i+2,j-1)==1)form(i,j)=0;form(i+1,j+1)=0;endifsum(sum(form(i-1:i+2,j-1:j+2)))==4&form(i-1,j+2)==1&form(i+2,j-1)==1form(i,j)=0;form(i+1,j+1)=0;endendifform(i,j+1)==1&form(i+1,j)==1&sum(sum(form(i:i+1,j:j+1)))==2ifsum(sum(form(i-1:i+2,j-1:j+2)))==3&(form(i-1,j-1)==1|form(i+2,j+2)==1)form(i,j+1)=0;form(i+1,j)=0;endifsum(sum(form(i-1:i+2,j-1:j+2)))==4&form(i-1,j-1)==1&form(i+2,j+2)==1form(i,j+1)=0;form(i+1,j)=0;endendendendmax=0;fori=3:line-3forj=3:column-3s=sum(sum(form(i-2:i+2,j-2:j+2)));form=i-2:i+2forn=j-2:j+2ifs>=7&abs(coef3(m,n))<=s*3form(m,n)=0;endendendendendfigure;imshow(form,[]);
Ⅷ 【求助】求matlab小波变换图像处理实现程序~
%这个是2D-DWT的函数,是haar小波
%c是图像像素矩阵steps是变换的阶数
functiondwtc=dwt_haar(c,steps)
%DWTC=CWT_HARR(C)-
%
%MDPlumbleyNov2003
N=length(c)-1;%Maxindexforfilter:0..N
%Ifnostepstodo,orthesequenceisasinglesample,theDWTisitself
if(0==N|steps==0)
dwtc=c;
return
end
%CheckthatN+1isdivisibleby2
if(mod(N+1,2)~=0)
disp(['Notdivisible2:'num2str(N+1)]);
return
end
%SettheHaaranalysisfilter
h0=[1/21/2];%HaarLow-passfilter
h1=[-1/21/2];%HaarHigh-passfilter
%Filterthesignal
lowpass_c=conv(h0,c);
hipass_c=conv(h1,c);
%Subsamplebyfactorof2andscale
c1=sqrt(2)*lowpass_c(2:2:end);
d1=sqrt(2)*hipass_c(2:2:end);
%Recursivelycalldwt_haaronthelow-passpart,with1fewersteps
dwtc1=dwt_haar(c1,steps-1);
%ConstructtheDWTfromc1andd1
dwtc=[dwtc1d1];
%Done
return
--------------------------分割线--------------------------
调用这个函数的例子下面的东西放在另一个文档里
读入一个图像‘lena’应该是个最基础的图像了~
之后分别作0阶和1阶2D-DWT的变换
改变阶数可以做更高阶的
clearall
im=imreadreal('lena.bmp');%readimagedata
%Plot
figure
dwt2_step0=dwt2_haar(im,0);%2DDWTstep=0
imagesc(dwt2_step0);
colormapgray;
axisimage;
figure
dwt2_step1=dwt2_haar(im,1);%2DDWTstep=1
imagesc(dwt2_step1);
colormapgray;
axisimage;
---------------------分割线---------------------
结果如下1阶的结果
这是我的一个实验希望有所帮助
Ⅸ 跪求 用matlab程序编写‘基于小波变换的图像边缘检测’ 要两种程序对照的 两种方法 谢谢
举个例子,希望有所帮助。clc; clear all; close all;
X=rgb2gray(imread('lena.jpg'));
x=X;
x=double(x);
line=250;
column=250;
J=6;
Tu=7;
smooth_area_num=20;
edge_area_num=40;
for i=1:line
coef1(i,:)=cwt(x(i,:),1,'bior4.4');
coef2(i,:)=cwt(x(i,:),2,'bior4.4');
coef3(i,:)=cwt(x(i,:),J,'bior4.4');
end
max=0;
max_loc=0;
max_num=15;
for i=1:line
j=1;
while j<column-1
if (coef3(i,j)>0 & coef3(i,j+1)<0) | (coef3(i,j)<0 & coef3(i,j+1)>0 )%找到左位置j
for k=j+1:column-1
if coef3(i,k)*coef3(i,j)>=0%找到右位置k
for m=j:k
if abs(coef3(i,m))>max
max=abs(coef3(i,m));
max_loc=m;
end
end
if max>max_num
form(i,max_loc)=1;
end
j=k;
max=0;
break;
end
end%for k
if k==column-1
j=column-1;
end
else
j=j+1;
end%if
end%while
end%对列作小波变换
x=x';
for i=1:line
coef1(i,:)=cwt(x(i,:),1,'bior4.4');
coef2(i,:)=cwt(x(i,:),2,'bior4.4');
coef3(i,:)=cwt(x(i,:),J,'bior4.4');
end
%正值1,负值0的矩阵temp表示(突变点左位置)
max=0;
max_loc=0;
for i=1:line
j=1;
while j<column-1
if (coef3(i,j)>0 & coef3(i,j+1)<0) | (coef3(i,j)<0 & coef3(i,j+1)>0 )%找到左位置j
for k=j+1:column-1
if coef3(i,k)*coef3(i,j)>=0%找到右位置k
for m=j:k
if abs(coef3(i,m))>max
max=abs(coef3(i,m));
max_loc=m;
end
end
if max>max_num
form(max_loc,i)=1;
end
j=k;
max=0;
break;
end
end%for k
if k==column-1
j=column-1;
end
else
j=j+1;
end%if
end%while
endfor i=2:line-2
for j=2:column-2
%链长为1
if form(i,j-1)==0 & form(i,j+1)==0 & form(i-1,j-1)==0 & form(i-1,j)==0 & form(i-1,j+1)==0 & form(i+1,j-1)==0 & form(i+1,j)==0 & form(i+1,j+1)==0
form(i,j)=0;%
end
if form(i,j)==1 & form(i,j+1)==1 & sum(sum(form(i-1:i+1,j-1:j+2)))==2
form(i,j)=0;
form(i,j+1)=0;
end if form(i,j)==1 & form(i+1,j)==1 & sum(sum(form(i-1:i+2,j-1:j+1)))==2
form(i,j)=0;
form(i+1,j)=0;
end if form(i,j)==1 & form(i+1,j+1)==1 & sum(sum(form(i:i+1,j:j+1)))==2
if sum(sum(form(i-1:i+2,j-1:j+2)))==3 & ( form(i-1,j+2)==1 | form(i+2,j-1)==1)
form(i,j)=0;
form(i+1,j+1)=0;
end
if sum(sum(form(i-1:i+2,j-1:j+2)))==4 & form(i-1,j+2)==1 & form(i+2,j-1)==1
form(i,j)=0;
form(i+1,j+1)=0;
end
end if form(i,j+1)==1 & form(i+1,j)==1 & sum(sum(form(i:i+1,j:j+1)))==2
if sum(sum(form(i-1:i+2,j-1:j+2)))==3 & ( form(i-1,j-1)==1 | form(i+2,j+2)==1)
form(i,j+1)=0;
form(i+1,j)=0;
end
if sum(sum(form(i-1:i+2,j-1:j+2)))==4 & form(i-1,j-1)==1 & form(i+2,j+2)==1
form(i,j+1)=0;
form(i+1,j)=0;
end
end
end
endmax=0;
for i=3:line-3
for j=3:column-3
s=sum(sum(form(i-2:i+2,j-2:j+2)));
for m=i-2:i+2
for n=j-2:j+2
if s>=7 & abs(coef3(m,n))<=s*3
form(m,n)=0;
end
end
end
end
endfigure;
imshow(form, []);
Ⅹ 小波变换的matlab程序: wavename='cmor5-2';
嗯,照道理是没有固定单位滴,小波分析用的是相对概念,即要根据原始信号频率换算,如何设置参数从原理上都是合理的,就看你需要分析哪些特征,多试几次,选择结果好的就行。