提示:任何排序算法的执行路径都是使用分支点的比较结果进行定义的。如果解码器和编码器使用相同的排序算法,则对于编码器输入的系数比较结果,解码器通过执行相同的路径就可获得排序信息。
所以,只需将编码器数学表述中的“输出”改为“输入”,解码器即可恢复数据的排序信息;在恢复数据排序信息的同时,解码器还要负责图像的重构,对于确认恢复的重要系数,通过排序扫描和精细扫描两个步骤更新系数的量化值,逐步提高逼近精度和重构图像的质量。
global rMat cMat
% rMat、cMat是Mat的行、列数,作为全局变量,在编码、解码的相关程序中使用
% 读入当前 LIS 的表长
rlis=size(LIS,1);
% ls 是指向 LIS 当前表项位置的指针,初始位置为1
ls=1;
while ls<=rlis
% 读入当前 LIS 表项的类型
switch LisFlag(ls)
% ‘D’类表项,包含孩子和非直系子孙
case 'D'
% 读入该表项的坐标值
rP=LIS(ls,1);
cP=LIS(ls,2);
% 根据 Sn 判断该表项‘D’型子孙树是否重要
if Sn(1)==1
% 每次判断都是读入 Sn 的首位数,判断后立即删除这一位数
Sn(1)=[];
% 生成该表项的孩子树
chO=coef_DOL(rP,cP,'O');
% 分别判断每个孩子的重要性
for r=1:4
% 读入孩子的坐标值
rO=chO(r,1);
cO=chO(r,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
% 将该孩子添加到重要系数列表 LSP
LSP=[LSP;chO(r,:)];
else
% 如果不重要,则这个孩子的系数值为 0
DecodeMat(rO,cO)=0;
Sn(1)=[];
% 将