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

📄 ztc.m

📁 这是一个不错的光谱压缩的Matlab程序,希望它能对你有所帮助.
💻 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 + -