?? spihtdecoding.m
字號:
function DecodeMat=spihtdecoding(T,SnList,RnList,ini_LSP,ini_LIP,ini_LIS,ini_LisFlag,decodeDim)
% 函數 SPIHTDECODING() 是SPIHT算法的解碼主程序
% 輸入參數: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型兩種
% decodeDim —— 解碼級數
% 輸出參數:DecodeMat —— 解碼后重構的小波系數矩陣
%
% 由SPIHT算法原理的排序特點,解碼器的執行程序與編碼器的程序路徑基本相同,只需把編碼器程序中的
% 輸出信息改為輸入,稍作修改即可得到解碼器的程序代碼
global rMat cMat
% rMat、cMat是Mat的行、列數,作為全局變量,在編碼、解碼的相關程序中使用
%-------------------------------------------%
% ----- Decoding Input Initialization ----- %
%-------------------------------------------%
N=log2(T);
% 獲取初始閾值的指數-N
DecodeMat=2^(N-decodeDim)*rand(rMat,cMat);
% 初始化重構矩陣為一個隨機矩陣,其元素最大值小于最高級解碼閾值的二分之一
% 這樣就可以保證未被掃描賦值的區域有一定的灰度,避免重構圖像出現色塊
LSP=ini_LSP;
LIP=ini_LIP;
LIS=ini_LIS;
LisFlag=ini_LisFlag;
% 將輸入的各項列表存入相應的解碼工作列表
%---------------------------%
% ----- Decoding Loop ----- %
%---------------------------%
for d=1:decodeDim
%-------------------------------------%
% ----- Decoding Initialization ----- %
%-------------------------------------%
[Sn,SnList]=getflow(SnList);
[Rn,RnList]=getflow(RnList);
% 用 GETFLOW() 函數讀取本級解碼所需的位流信息
LSP_Old=LSP;
% 列表LSP_Old用于存儲上級解碼產生的重要系數列表LSP,作為本級精細解碼的輸入
%--------------------------%
% ----- Sorting Pass ----- %
%---%----------------------%
% ----- LIP Scan ----- %
%----------------------%
[DecodeMat,Sn,LSP,LIP]=lip_decode(DecodeMat,Sn,N,LSP,LIP);
%----------------------%
% ----- LIS Scan ----- %
%----------------------%
[LSP,LIP,LIS,LisFlag,DecodeMat,N]=lis_decode(DecodeMat,N,Sn,LSP,LIP,LIS,LisFlag);
%-----------------------------%
% ----- Refinement Pass ----- %
%-----------------------------%
DecodeMat=decRefine(DecodeMat,Rn,N+1,LSP_Old);
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 + -