📄 ztc.m
字号:
function [codes,len,pic]=ztc(pic,scale,T)
%用法:[codes,len,pic]=ztc(pic,scale,T)
%功能:对scale级小波分解后的图像pic作零树编码,阈值为T
%对于大于阈值的点作量化编码处理,使量化误差控制在4以下
%结果codes为code_length*M_step*N_step的三维矩阵,存编码结果
%len为M_step*N_step的二维矩阵,存编码结果的长度
%pic为编码处理后的图像,可用作下次减小阈值后进行编码
%M,N为图像尺寸
[M,N]=size(pic);
%量化间隔为8
err=8;
%scale级分解后的图像的行数和列数为M_step和N_step
M_step=M/2^scale;
N_step=N/2^scale;
%量化间隔为8时对当前阈值尺度量化所需的bit数
bit_len=ceil(log2(T/err));
%一共有M_step*N_step棵零树
for x=1:M_step
for y=1:N_step
%编码结果计数器code_cnt置为1
code_cnt=1;
code=[];
%队列计数器置为0;
stack_cnt=0;
%对左上角的点单独编码
if abs(pic(x,y))>=T
%如果值大于阈值且为正,则编码结果为101
if pic(x,y)>0
code='101';
else
%如果值大于阈值且为负,则编码结果为110
code='110';
end
%在编码结果后面加上量化值
code=[code,dec2bin(floor((abs(pic(x,y))-T)/err),bit_len)];
%原图像该点置零,以便下一次减小阈值后进行编码
pic(x,y)=0;
else
%该点小于阈值,编码结果为0
code='0';
end
%将零树的紧接着的三点的坐标放入队列
stack(1,1:2)=[x,y+N_step];
stack(2,1:2)=[x+M_step,y];
stack(3,1:2)=[x+M_step,y+N_step];
stack_cnt=3;
%如果队列非空,则一直循环
while stack_cnt>0
% 取出队列头的点的坐标作为当前点
xx=stack(1,1);
yy=stack(1,2);
stack_cnt=stack_cnt-1;
%队列整理
for i=1:stack_cnt
stack(i,:)=stack(i+1,:);
end
%value为当前点的值
value=pic(xx,yy);
%当前点编码
if abs(value)>T
if value>0
code=[code,'101'];
else
code=[code,'110'];
end
code=[code,dec2bin(floor((abs(value)-T)/err),bit_len)];
if (xx*2<=M)&(yy*2<=N)
%如果未到达图像边缘,则将该点四个子节点放入队列尾
stack(stack_cnt+1,1:2)=[xx*2-1,yy*2-1];
stack(stack_cnt+2,1:2)=[xx*2-1,yy*2];
stack(stack_cnt+3,1:2)=[xx*2,yy*2-1];
stack(stack_cnt+4,1:2)=[xx*2,yy*2];
stack_cnt=stack_cnt+4;
end
%原图像该点置零,以便下一次减小阈值后进行编码
pic(xx,yy)=0;
else
xxx=xx;yyy=yy;
while(1)
xx=min(xx)*2-1:max(xx)*2;
yy=min(yy)*2-1:max(yy)*2;
if (max(xx)>M)|(max(yy)>N)
code=[code,'0'];
break;
end
if (abs(pic(xx,yy))>=T)==zeros(size(pic(xx,yy)))
else
%如果当前点为孤立零且未到达图像边缘,则将该点四个子节点放入队列尾
stack(stack_cnt+1,1:2)=[xxx*2-1,yyy*2-1];
stack(stack_cnt+2,1:2)=[xxx*2-1,yyy*2];
stack(stack_cnt+3,1:2)=[xxx*2,yyy*2-1];
stack(stack_cnt+4,1:2)=[xxx*2,yyy*2];
stack_cnt=stack_cnt+4;
code=[code,'100'];
break;
end
end
end
end
%存当前树的编码长度与编码值
len(x,y)=length(code);
codes(1:len(x,y),x,y)=code;
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -