?? spihtcoding.asv
字號:
function [T,SnList,RnList,ini_LSP,ini_LIP,ini_LIS,ini_LisFlag]=spihtcoding(DecIm,imDim,codeDim)
% 函數 SPIHTCODING() 是SPIHT算法的編碼主程序
% 輸入參數:DecIm ——小波分解系數矩陣;
% imDim ——小波分解層數;
% codeDim ——編碼級數。
% 輸出參數:T —— 初始閾值,T=2^N,N=floor(log2(max{|c(i,j)|})),c(i,j)為小波系數矩陣的元素
% SnList —— 排序掃描輸出位流
% RnList —— 精細掃描輸出位流
% ini_L* —— 初始系數(集合)表
% LSP:重要系數表
% LIP:不重要系數表
% LIS:不重要子集表,其中的表項是D型或L型表項的樹根點
% LisFlag:LIS中各表項的類型,包括D型和L型兩種
global Mat rMat cMat
% Mat是輸入的小波分解系數矩陣,作為全局變量,在編碼的相關程序中使用
% rMat、cMat是Mat的行、列數,作為全局變量,在編碼、解碼的相關程序中使用
%-----------------------%
% ----- Threshold ----- %
%-----------------------%
Mat=DecIm;
MaxMat=max(max(abs(Mat)));
N=floor(log2(MaxMat));
T=2^N;
% 公式:N=floor(log2(max{|c(i,j)|})),c(i,j)為小波系數矩陣的元素
%----------------------------------%
% ----- Output Intialization ----- %
%----------------------------------%
SnList=[];
RnList=[];
ini_LSP=[];
ini_LIP=coef_H(imDim);
rlip=size(ini_LIP,1);
ini_LIS=ini_LIP(rlip/4+1:end,:);
rlis=size(ini_LIS,1);
i=1;
while i<=rlis
rS=ini_LIS(i,1);
cS=ini_LIS(i,2);
[Dch,Och]=childMat(rS,cS);
if isempty(Dch)
ini_LIS(i,:)=[];
end
rlis=size(ini_LIS,1);
i=i+1;
end
ini_LisFlag(1:rlis)='D';
% ini_LSP:掃描開始前無重要系數,故LSP=[];
% ini_LIP:所有樹根的坐標集,對于N層小波分解,LIP是LL_N,LH_N,HL_N,HH_N 所有
% 系數的坐標集合;
% 函數 COEF_H() 用于計算樹根坐標集 H
% ini_LIS:初始時,LIS是LH_N,HL_N,HH_N 所有系數的坐標集合;在SPIHT算法中,
% LL_N 沒有孩子。
% ini_LisFlag:初始時,LIS列表的表項均為D型。
%-----------------------------------------%
% ----- Coding Input Initialization ----- %
%-----------------------------------------%
LSP=ini_LSP;
LIP=ini_LIP;
LIS=ini_LIS;
LisFlag=ini_LisFlag;
% 將待輸出的各項列表存入相應的編碼工作列表
%-------------------------%
% ----- Coding Loop ----- %
%-------------------------%
for d=1:codeDim
d
%-----------------------------------%
% ----- Coding Initialization ----- %
%-----------------------------------%
Sn=[];
LSP_Old=LSP;
% 每級編碼產生的Sn都是獨立的,故Sn初始化為空表
% 列表LSP_Old用于存儲上級編碼產生的重要系數列表LSP,作為本級精細掃描的輸入
%--------------------------%
% ----- Sorting Pass ----- %
%---%----------------------%
% ----- LIP Scan ----- %
%----------------------%
[Sn,LSP,LIP]=lip_scan(Sn,N,LSP,LIP);
% 檢查LIP表的小波系數,更新列表LIP、LSP和排序位流 Sn
%----------------------%
% ----- LIS Scan ----- %
%----------------------%
[LSP,LIP,LIS,LisFlag,Sn,N]=lis_scan(N,Sn,LSP,LIP,LIS,LisFlag);
% 這里,作為輸出的N比作為輸入的N少1,即 out_N=in_N-1
% 各項輸出參數均作為下一編碼級的輸入
%-----------------------------%
% ----- Refinement Pass ----- %
%-----------------------------%
Rn=refinement(N+1,LSP_Old);
% 精細掃描是在當前閾值T=2^N下,掃描上一編碼級產生的LSP,故輸入為(N+1,LSP_Old),
% 輸出為精細位流 Rn
%-----------------------------%
% ----- Output Dataflow ----- %
%-----------------------------%
SnList=[SnList,Sn,7];
RnList=[RnList,Rn,7];
% 數字‘7’作為區分符,區分不同編碼級的Rn、Sn位流
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -