📄 lzwdecode2.m
字号:
function decode=lzwdecode2(code,si,max)
%lzwdecode(code) used to decode of lzw .the parameter code is a 1*m!
% and it return the lzw decode 1*n
%LZW解码,输入code为LZW编码序列,si为要解码生成图像的 row*col ,max 为解码字典的初始化最大值,默认为255
%返回 decode 为一个2维图像数据
curcode=[]; %识别序列
nn=0;
if nargin==2
max=255;
end
for f=0:max
dictcode(f+1,1)=f; %字典条目,注意实际数与下标相差一
dictcode(f+1,2)=-1; %字典条目,注意实际数与下标相差一
end
n=max+1;
len=length(code);
curcode=code(1);
decode2(1,:)=dictcode(code(1)+1,:); %解码输出
for d=2:len
if code(d)+1> n %证明出现了,连续的符号,怎么处理????????????
hi22=find(dictcode(code(d-1)+1,:)==-1)-1;
curcode=dictcode(code(d-1)+1,1:hi22);
curcode=[curcode curcode(1)];
n=n+1; %向字典增加条目
vc=length(curcode);
for ll=1:vc
dictcode(n,ll)=curcode(ll);
decode2(d,ll)=curcode(ll); %解码输出
end
dictcode(n,vc+1)=-1;
decode2(d,vc+1)=-1;
if code(d+1)+1 <= n
curcode=code(d);
end
else
hi1=find(dictcode(code(d)+1,:)==-1);
for ass=1:hi1
decode2(d,ass)=dictcode(code(d)+1,ass); %解码输出
end
n=n+1;
hi=find(dictcode(curcode+1,:)==-1)-1;
for ll=1:hi
dictcode(n,ll)=dictcode(curcode+1,ll); %向字典增加条目
end
dictcode(n,hi+1)=decode2(d,1);
dictcode(n,hi+2)=-1;
curcode=code(d);
end
end
%对所得的解码输出进行,还原图像
hang=si(1);
lie=si(2);
leng=length(decode2(1,:));
xx=0;
for d=1:len %组成一个一维数组
for kk=1:leng
if decode2(d,kk)~=-1
xx=xx+1;
dedata(xx)= decode2(d,kk);
else
break;
end
end
end
len2=length(dedata);
%把一维数组reshape为二维数组
hang=si(1);
lie=si(2);
for g=1:len2
dc(ceil(g/lie),mod(g-1,lie)+1)=dedata(g);
end
decode=dc;
%decode=reshape(dedata,si(2),si(1));
%decode=rot90(decode);
%decode=flipud(decode);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -