?? spihtdecoding.asv
字號:
function DecodeMat=spihtdecoding(T,SnList,decodeDim)
% 函數 SPIHTDECODING() 是SPIHT算法的解碼主程序
% 輸入參數:T —— 初始閾值,T=2^N,N=floor(log2(max{|c(i,j)|})),c(i,j)為小波系數矩陣的元素
% SnList —— 排序掃描輸出位流
% decodeDim —— 解碼級數
% 輸出參數:DecodeMat —— 解碼后重構的小波系數矩陣
%
% 由SPIHT算法原理的排序特點,解碼器的執行程序與編碼器的程序路徑基本相同,只需把編碼器程序中的
% 輸出信息改為輸入,稍作修改即可得到解碼器的程序代碼
global rMat cMat
% rMat、cMat是Mat的行、列數,作為全局變量,在編碼、解碼的相關程序中使用
%-------------------------------------------%
% ----- Decoding Input Initialization ----- %
%-------------------------------------------%
N=log2(T);
% 獲取初始閾值的指數-N
DecodeMat=2^(N-decodeDim)*rand(rMat,cMat);
% 初始化重構矩陣為一個隨機矩陣,其元素最大值小于最高級解碼閾值的二分之一
% 這樣就可以保證未被掃描賦值的區域有一定的灰度,避免重構圖像出現色塊
%----------------------------------%
% ----- Output Intialization ----- %
%----------------------------------%
Sn=[];
FlagCoef=zeros(rMat,cMat);
FlagDch=zeros(rMat/2,cMat/2);
FlagLch=zeros(rMat/2,cMat/2);
FlagLch(1,1)=1;
scanorder=listorder(rMat/2,cMat/2,1,1);
%-------------------------%
% ----- Coding Loop ----- %
%-------------------------%
for d=1:decodeDim
[Sn,SnList]=getflow(SnList);
[Rn,RnList]=getflow(RnList);
% 對系數C(1,1)單獨編碼
if FlagCoef(1,1)==1
[DecodeMat,Rn]=decRefine(DecodeMat,Rn,N,1,1);
else
if Sn(1)==1
Sn(1)=[];
if Sn(1)==1
Sn(1)=[];
DecodeMat(1,1)=1.5*2^N;
else
Sn(1)=[];
DecodeMat(1,1)=-1.5*2^N;
end
FlagCoef(1,1)=1;
else
Sn(1)=[];
DecodeMat(1,1)=0;
end
end
% 掃描 FlagDch
for i=1:rMat*cMat/4
rD=scanorder(i,1);
cD=scanorder(i,2);
if FlagDch(rD,cD)==1
chO=coef_DOL(rD,cD,'O');
for j=1:4
rO=chO(j,1);
cO=chO(j,2);
if FlagCoef(rO,cO)==1
[DecodeMat,Rn]=decRefine(DecodeMat,Rn,N,rO,cO);
else
if Sn(1)==1
Sn(1)=[];
if Sn(1)==1
Sn(1)=[];
DecodeMat(rO,cO)=1.5*2^N;
else
Sn(1)=[];
DecodeMat(rO,cO)=-1.5*2^N;
end
FlagCoef(rO,cO)=1;
else
Sn(1)=[];
DecodeMat(rO,cO)=0;
end
end
end
end
end
% 掃描 FlagLch
for i=1:rMat*cMat/4
rL=scanorder(i,1);
cL=scanorder(i,2);
if FlagDch(rL,cL)==0
if Sn(1)==1
Sn(1)=[];
FlagDch(rL,cL)=1;
chO=coef_DOL(rL,cL,'O');
for j=1:4
rO=chO(j,1);
cO=chO(j,2);
if Sn(1)==1
Sn(1)=[];
if Sn(1)==1
Sn(1)=[];
DecodeMat(rO,cO)=1.5*2^N;
else
Sn(1)=[];
DecodeMat(rO,cO)=-1.5*2^N;
end
FlagCoef(rO,cO)=1;
else
Sn(1)=[];
DecodeMat(rO,cO)=0;
end
end
chL=coef_DOL(rL,cL,'L');
if isempty(chL)
FlagLch(rL,cL)=0;
else
isImt=SnOut(chL,N);
if isImt
Sn=[Sn,1];
FlagLch(rL,cL)=1;
chO=coef_DOL(rL,cL,'O');
for j=1:4
rO=chO(j,1);
cO=chO(j,2);
FlagLch(rO,cO)=1;
end
else
Sn=[Sn,0];
end
end
else
Sn=[Sn,0];
end
end
end
N=N-1;
% 數字‘7’作為區分符,區分不同編碼級的Rn、Sn位流
end
function [flow,bitflow]=getflow(bitflow)
% 函數 GETFLOW() 用于截取本級解碼所需的位流信息
% 輸入參數:bitflow —— 初始為編碼器的輸入位流,在解碼過程中為上一級解碼截取后剩余的編碼位流
% 輸出參數:flow —— 本級解碼所需的位流(排序位流Sn、精細位流Rn)
% bitflow —— 本級解碼截取后剩余的編碼位流
flow=[];
i=1;
while bitflow(i)~=7
flow(i)=bitflow(i);
i=i+1;
end
% 數字‘7’作為位流區別符,區分不同編碼級的位流
bitflow(1:i)=[];
% 將對應于本級解碼位流的 bitflow 數據清空
% bitflow 被完全清空后返回一個空表值
if isempty(bitflow)
bitflow=[];
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -