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';
嗯,照道理是沒有固定單位滴,小波分析用的是相對概念,即要根據原始信號頻率換算,如何設置參數從原理上都是合理的,就看你需要分析哪些特徵,多試幾次,選擇結果好的就行。