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

📄 spihtdecoding.m

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


global rMat cMat
% rMat、cMat是Mat的行、列数,作为全局变量,在编码、解码的相关程序中使用

%-------------------------------------------%
% ----- Decoding Input Initialization ----- %
%-------------------------------------------%
N=log2(T);
% 获取初始阈值的指数-N
DecodeMat=2^(N-decodeDim)*rand(rMat,cMat);
% 初始化重构矩阵为一个随机矩阵,其元素最大值小于最高级解码阈值的二分之一
% 这样就可以保证未被扫描赋值的区域有一定的灰度,避免重构图像出现色块

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);
%-------------------------%
% ----- Decoding 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');
            row=size(chO,1);
            for j=1:row
                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');
                row=size(chO,1);
                for j=1:row
                    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
                    if Sn(1)==1
                        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(1)=[];
                    end
                end
            else
                Sn(1)=[];
            end
        end
    end
    N=N-1;
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 + -