讨论:一种基于状态位图的SPIHT改进算法(2)——编解码程序

本文介绍了对SPIHT算法的一种基于状态位图的改进,并提供了MATLAB实现的主要代码段,包括编码和解码过程。通过小波分解、编码循环和解码循环,实现了对图像的高效压缩。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
根据上一篇文章提及的改进算法步骤,编写了如下主要代码,其他的相关程序,例如childMat()、coef_DOL()、SnOut()、fracnum2bin()等函数的代码,请参阅我之前发布的SPIHT算法过程详解与Matlab实现的文章,主要代码如下:

function RecIm=spiht(Im,imDim,codeDim,decodeDim)

global rMat cMat

% ----- 起始时间 ----- %
strtime=cputime;

[rMat,cMat]=size(Im);
% ----- 小波分解 ----- %
DecIm=mywavedec2(Im,imDim);
% ----- M_SPIHT Coding ----- %
[T,SnList,RnList]=spihtcoding(DecIm,codeDim);
% ----- M_SPIHT Decoding ----- %
DecodeMat=spihtdecoding(T,SnList,RnList,decodeDim);
% ----- 小波重构 -----%
RecIm=mywaverec2(DecodeMat,imDim,decodeDim);

% ----- 运行时间 ----- %
runtime=cputime-strtime

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 —— 排序扫描输出位流

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];
                 &nb

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值