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

📄 spihtcoding.m

📁 一种SPIHT的改进算法!!!mallat算法实现,还有待提高!多联系lhz_5156@163.com
💻 M
字号:
function [T,SnList,RnList]=spihtcoding(DecIm,codeDim)
% 函数 SPIHTCODING() 是SPIHT算法的编码主程序
% 输入参数:DecIm   ——小波分解系数矩阵;
%          imDim   ——小波分解层数;
%          codeDim ——编码级数。
% 输出参数:T —— 初始阈值,T=2^N,N=floor(log2(max{|c(i,j)|})),c(i,j)为小波系数矩阵的元素
%          SnList —— 排序扫描输出位流
%          RnList —— 精细扫描输出位流

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=[];
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:codeDim
    Sn=[];
    Rn=[];
    % 对系数C(0,0)单独编码
    if FlagCoef(1,1)==1
        [biLSP,Np]=fracnum2bin(abs(Mat(1,1)),N);
        Rn=[Rn,biLSP(Np)];
    else
        [isImt,Sign]=SnOut([1 1],N);
        if isImt
            Sn=[Sn,1,Sign];
            FlagCoef(1,1)=1;
        else
            Sn=[Sn,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');
            row=size(chO,1);
            for j=1:row
                rO=chO(j,1);
                cO=chO(j,2);
                if FlagCoef(rO,cO)==1
                    [biLSP,Np]=fracnum2bin(abs(Mat(rO,cO)),N);
                    Rn=[Rn,biLSP(Np)];
                else
                    [isImt,Sign]=SnOut([rO,cO],N);
                    if isImt
                        Sn=[Sn,1,Sign];
                        FlagCoef(rO,cO)=1;
                    else
                        Sn=[Sn,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
            chD=coef_DOL(rL,cL,'D');
            isImt=SnOut(chD,N);
            if isImt
                Sn=[Sn,1];
                FlagDch(rL,cL)=1;
                chO=coef_DOL(rL,cL,'O');
                row=size(chO,1);
                for j=1:row
                    rO=chO(j,1);
                    cO=chO(j,2);
                    [isImt,Sign]=SnOut([rO,cO],N);
                    if isImt
                        Sn=[Sn,1,Sign];
                        FlagCoef(rO,cO)=1;
                    else
                        Sn=[Sn,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');
                        row=size(chO,1);
                        for j=1:row
                            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;
    SnList=[SnList,Sn,7];    
    RnList=[RnList,Rn,7];
    % 数字‘7’作为区分符,区分不同编码级的Rn、Sn位流
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -