?? 提升法97經(jīng)典程序.txt
字號(hào):
提升法97經(jīng)典程序
%% 本程序?qū)崿F(xiàn)任意偶數(shù)大小圖像第二代雙正交97提升小波變換
%% 注1: 采用標(biāo)準(zhǔn)正交方法,對(duì)行列采用不同矩陣(和matlab里不同)
%% 注2: 為了保證正交,所有邊界處理,全部采用循環(huán)處理
%% 注3: 正交性驗(yàn)證,將單位陣帶入函數(shù),輸出仍是單位陣(matlab不具有此性質(zhì))
%% 注4: 此程序是矩陣實(shí)現(xiàn),所以圖像水平分量和垂直分量估計(jì)被交換位置
%% 注5: 此程序?qū)崿F(xiàn)的是類小波(wavelet-like)變換,是介于小波包變換與小波變換之間的變換
%% 注6: 此程序每層變換相對(duì)原圖像矩陣,產(chǎn)生的矩陣都是正交陣,這和小波包一致
%% 注7: 但小波變換每層產(chǎn)生的矩陣,是相對(duì)每個(gè)待分解子塊的正交矩陣,而不是原圖像的正交矩陣
%% 注8: 且小波變換產(chǎn)生的正交矩陣維數(shù),隨分解層數(shù)2分減少
%% 注9: 提升系數(shù)可以在MATLAB7.0以上版本,用liftwave('9.7')獲取,這里直接給出,考慮兼容性
%% 注10:由于MATLAB數(shù)組下標(biāo)從1開始,所以注意奇偶序列的變化
%% 注11:d為對(duì)偶上升,即預(yù)測;p為原上升,即更新
%% x輸入圖像,y輸出圖像
%% flag_trans為正變換或反變換標(biāo)志,0執(zhí)行正變換,1執(zhí)行反變換
%% flag_max,是否最大層數(shù)變換標(biāo)志,0執(zhí)行用戶設(shè)定層數(shù),1執(zhí)行最大層數(shù)變換
%% layer,用戶層數(shù)設(shè)置(小于最大層)
function y=db97(x,flag_trans,flag_max,layer);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 1.輸入?yún)?shù)檢查
% 矩陣維數(shù)判斷
[sa,sb]=size(x);
if (sa~=sb) % 防止非圖像數(shù)據(jù)
errordlg('非圖像數(shù)據(jù)!');
error('非圖像數(shù)據(jù)!');
end;
% 變換標(biāo)志判斷
[sa,sb]=size(flag_trans);
if ((sa~=1) | (sb~=1)) % 變換標(biāo)志錯(cuò)誤
errordlg('變換標(biāo)志錯(cuò)誤!');
error('變換標(biāo)志錯(cuò)誤!');
end;
if ((flag_trans~=1) & (flag_trans~=0)) % 變換標(biāo)志錯(cuò)誤
errordlg('變換標(biāo)志錯(cuò)誤!');
error('變換標(biāo)志錯(cuò)誤!');
end;
% 最大層數(shù)標(biāo)志判斷
[sa,sb]=size(flag_max);
if ((sa~=1) | (sb~=1)) % 最大層數(shù)標(biāo)志錯(cuò)誤
errordlg('最大層數(shù)標(biāo)志錯(cuò)誤!');
error('最大層數(shù)標(biāo)志錯(cuò)誤!');
end;
if ((flag_max~=1) & (flag_max~=0)) % 最大層數(shù)標(biāo)志錯(cuò)誤
errordlg('最大層數(shù)標(biāo)志錯(cuò)誤!');
error('最大層數(shù)標(biāo)志錯(cuò)誤!');
end;
% 用戶設(shè)置層數(shù)判斷
if (flag_max~=1)
[sa,sb]=size(layer);
if ((sa~=1) | (sb~=1)) % 層數(shù)設(shè)置錯(cuò)誤
errordlg('層數(shù)設(shè)置錯(cuò)誤!');
error('層數(shù)設(shè)置錯(cuò)誤!');
end;
if (flag_max<0) % 層數(shù)設(shè)置錯(cuò)誤
errordlg('層數(shù)設(shè)置錯(cuò)誤!');
error('層數(shù)設(shè)置錯(cuò)誤!');
end;
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 2.提升系數(shù)確定
% t1=liftwave('9.7'); % 獲取提升系數(shù)(MATLAB7.0以后)
d1=[-1.586100000000000e+000,-1.586134342069360e+000];
p1=[1.079600000000000e+000,-5.298011857188560e-002];
d2=[-8.829110755411875e-001,-8.829110755411875e-001];
p2=[4.435068520511142e-001,1.576123746148364e+000];
d3=-8.698644516247808e-001;
p3=-1.149604398860242e+000;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 3.分解層數(shù)確定
% 采用用戶輸入和自動(dòng)給出最大層數(shù)兩種方法
N=length(x); % 矩陣大小
S=N; % 變量
s=log2(N); % 最大循環(huán)次數(shù)
n1=N/2; % 初始一半矩陣大小
n2=N; % 初始矩陣大小
u=0; % 初始值
% 對(duì)非2的整數(shù)冪大小圖像確定最大分解層數(shù)
for ss=1:s
if (mod(S,2)==0)
u=u+1;
S=S/2;
end;
end;
u=u-1; % 分解最大層數(shù)減1(后面的邊界處理造成)
% 最大層數(shù)確定
if (flag_max==0) % 手動(dòng)輸入
T=layer; % 用戶輸入值
else % 自動(dòng)確定最大層數(shù)
T=u; % 分解最大層數(shù)
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 4.最大層數(shù)和圖像大小檢查
if (T>u) % 防止用戶層數(shù)越界
errordlg('已超過最大分解層數(shù)!或者非偶數(shù)大小圖像!');
error('已超過最大分解層數(shù)!或者非偶數(shù)大小圖像!');
end;
if (mod(N,2)~=0) % 防止圖像大小錯(cuò)誤
errordlg('非偶數(shù)大小圖像!');
error('非偶數(shù)大小圖像!');
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 5.提升法正變換
if (flag_trans==0)
for time=1:T;
% 行正變換
% d;
x1(n1,:)=x(n2,:)+d1(2)*x(n2-1,:)+d1(1)*x(1,:);
x1([1:n1-1],:)=x([2:2:n2-2],:)+d1(2)*x([1:2:n2-3],:)+d1(1)*x([3:2:n2-1],:);
% p;
x(1,:)=x(1,:)+p1(2)*x1(n1,:)+p1(1)*x1(1,:);
x([2:n1],:)=x([3:2:n2-1],:)+p1(2)*x1([1:n1-1],:)+p1(1)*x1([2:n1],:);
x([n1+1:n2],:)=x1([1:n1],:);
% d;
x(n1+1,:)=x(n1+1,:)+d2(2)*x(n1,:)+d2(1)*x(1,:);
x([n1+2:n2],:)=x([n1+2:n2],:)+d2(2)*x([1:n1-1],:)+d2(1)*x([2:n1],:);
% p;
x(n1,:)=x(n1,:)+p2(2)*x(n1+1,:)+p2(1)*x(n1+2,:);
x(n1-1,:)=x(n1-1,:)+p2(2)*x(n2,:)+p2(1)*x(n1+1,:);
x([1:n1-2],:)=x([1:n1-2],:)+p2(2)*x([n1+2:n2-1],:)+p2(1)*x([n1+3:n2],:);
% 歸一
x([1:n1],:)=p3*x([1:n1],:);
x([n1+1:n2],:)=d3*x([n1+1:n2],:);
clear x1;
% 列正變換
% d;
x1(:,[1:n1])=x(:,[2:2:n2]);
% p;
x(:,1)=x(:,1)-d1(1)*x1(:,n1)-d1(2)*x1(:,1);
x(:,[2:n1])=x(:,[3:2:n2-1])-d1(1)*x1(:,[1:n1-1])-d1(2)*x1(:,[2:n1]);
x(:,[n1+1:n2])=x1(:,[1:n1]);
% d;
x(:,n2)=x(:,n2)-p1(1)*x(:,n1)-p1(2)*x(:,1);
x(:,[n1+1:n2-1])=x(:,[n1+1:n2-1])-p1(1)*x(:,[1:n1-1])-p1(2)*x(:,[2:n1]);
% p;
x(:,n1,:)=x(:,n1)-d2(1)*x(:,n2)-d2(2)*x(:,n1+1);
x(:,[1:n1-1])=x(:,[1:n1-1])-d2(1)*x(:,[n1+1:n2-1])-d2(2)*x(:,[n1+2:n2]);
% d;
x(:,n1+1)=x(:,n1+1)-p2(1)*x(:,n1-1)-p2(2)*x(:,n1);
x(:,n1+2)=x(:,n1+2)-p2(1)*x(:,n1)-p2(2)*x(:,1);
x(:,[n1+3:n2])=x(:,[n1+3:n2])-p2(1)*x(:,[1:n1-2])-p2(2)*x(:,[2:n1-1]);
% 歸一
x(:,[1:n1])=d3*x(:,[1:n1]);
x(:,[n1+1:n2])=p3*x(:,[n1+1:n2]);
clear x1;
n2=n2/2; % 原大小
n1=n2/2; % 一半大小
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 6.提升法反變換
else
n2=N/(2.^(T-1)); % 分解最小子塊維數(shù)
n1=n2/2;
for time=1:T;
% 行反變換
% 去歸一
x([1:n1],:)=x([1:n1],:)/p3;
x([n1+1:n2],:)=x([n1+1:n2],:)/d3;
% 反p;
x(n1,:)=x(n1,:)-p2(2)*x(n1+1,:)-p2(1)*x(n1+2,:);
x(n1-1,:)=x(n1-1,:)-p2(2)*x(n2,:)-p2(1)*x(n1+1,:);
x([1:n1-2],:)=x([1:n1-2],:)-p2(2)*x([n1+2:n2-1],:)-p2(1)*x([n1+3:n2],:);
% 反d;
x(n1+1,:)=x(n1+1,:)-d2(2)*x(n1,:)-d2(1)*x(1,:);
x([n1+2:n2],:)=x([n1+2:n2],:)-d2(2)*x([1:n1-1],:)-d2(1)*x([2:n1],:);
% 反p;
x1(1,:)=x(1,:)-p1(2)*x(n2,:)-p1(1)*x(n1+1,:);
x1([2:n1],:)=x([2:n1],:)-p1(2)*x([n1+1:n2-1],:)-p1(1)*x([n1+2:n2],:);
% 反d;
x(n2,:)=x(n2,:)-d1(2)*x1(n1,:)-d1(1)*x1(1,:);
x([2:2:n2-2],:)=x([n1+1:n2-1],:)-d1(2)*x1([1:n1-1],:)-d1(1)*x1([2:n1],:);
% 偶數(shù)
x([1:2:n2-1],:)=x1([1:n1],:);
clear x1;
% 列反變換
% 歸一
x(:,[1:n1])=x(:,[1:n1])/d3;
x(:,[n1+1:n2])=x(:,[n1+1:n2])/p3;
% 反d;
x(:,n1+1)=x(:,n1+1)+p2(1)*x(:,n1-1)+p2(2)*x(:,n1);
x(:,n1+2)=x(:,n1+2)+p2(1)*x(:,n1)+p2(2)*x(:,1);
x(:,[n1+3:n2])=x(:,[n1+3:n2])+p2(1)*x(:,[1:n1-2])+p2(2)*x(:,[2:n1-1]);
% 反p;
x(:,n1,:)=x(:,n1)+d2(1)*x(:,n2)+d2(2)*x(:,n1+1);
x(:,[1:n1-1])=x(:,[1:n1-1])+d2(1)*x(:,[n1+1:n2-1])+d2(2)*x(:,[n1+2:n2]);
% 反d;
x(:,n2)=x(:,n2)+p1(1)*x(:,n1)+p1(2)*x(:,1);
x(:,[n1+1:n2-1])=x(:,[n1+1:n2-1])+p1(1)*x(:,[1:n1-1])+p1(2)*x(:,[2:n1]);
% 反p;
x1(:,1)=x(:,1)+d1(1)*x(:,n2)+d1(2)*x(:,n1+1);
x1(:,[2:n1])=x(:,[2:n1])+d1(1)*x(:,[n1+1:n2-1])+d1(2)*x(:,[n1+2:n2]);
% 奇偶
x(:,[2:2:n2])=x(:,[n1+1:n2]);
x(:,[1:2:n2-1])=x1(:,[1:n1]);
clear x1;
n2=n2*2; % 原大小
n1=n2/2; % 一半大小
end;
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 7.結(jié)果輸出
y=x; % 傳輸最后結(jié)果
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 8.內(nèi)存清理
clear x;
clear flag_max;
clear layer;
clear flag_trans;
clear N;
clear n1;
clear n2;
clear s;
clear ss;
clear u;
clear d1;
clear d2;
clear d3;
clear p1;
clear p2;
clear p3;
clear sa;
clear sb;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -