⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spihtcoding.asv

📁 spiht编码
💻 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 + -