function [HuffmanCodeStr,HuffmanTables,numblock,ziprate]=block_Proc(Input_DCT_Image)
sub_a_len=8;%程序实现分块处理的方式,块的大小为8x8
[height_a,wide_a]=size(Input_DCT_Image);
numblock=floor([height_a,wide_a]/sub_a_len);
mpad=rem(height_a,numblock(1));%重新调整大小
npad=rem(wide_a,numblock(2));
if mpad~=0|npad~=0%如果不能被整分,需要补零直到能整分为止
updated_Image=zeros(height_a+(8-mpad)*(mpad~=0),wide_a+(8-npad)*(npad~=0));%再将原始值从左上角开始填充新的值
updated_Image(1:height_a,1:wide_a)=Input_DCT_Image;%新图像矩阵赋新值
Input_DCT_Image=updated_Image;clear updated_Image;
end
numblock=size(Input_DCT_Image)/sub_a_len;%得到新的分块数
k=1;ziprate=0;%从Input_DCT_Image中取出8*8的块进行z扫描和编码
for i=1:numblock(1)
for j=1:numblock(2)
sub_Block=Input_DCT_Image((i-1)*sub_a_len+1:i*sub_a_len,(j-1)*sub_a_len+1:j*sub_a_len);
[HuffmanCodeStr{k},HuffmanTables(k)]=zig_zag_Scan(sub_Block);
ziprate=ziprate+HuffmanTables(k).ZipRate;
k=k+1;
end
end
ziprate=ziprate/(k+1);%计算平均压缩率
function [HuffmanCodeStr,HuffmanTalbe]=zig_zag_Scan(ori_Image);%实现zig-zag扫描,并且进行Huffman编码
[n,m]=size(ori_Image);
if(n~=8&m~=8)
error('输入必须是8*8的方阵');
end
zigzag=[0,1,8,16,9,2,3,10,
17,24,32,25,18,11,4,5,
12,19,26,33,40,48,41,34,
27,20,13,6,7,14,21,28,
35,42,49,56,57,50,43,36,
29,22,15,23,30,37,44,51,
58,59,52,45,38,31,39,46,
53,60,61,54,47,55,62,63];
zigzag=zigzag+1;
aa=reshape(ori_Image',1,64);%将输入块变成1x64的向量
b=aa(zigzag);%对aa按照查表方式取元素,得到zig-zag扫描结果
h_len=length(b);%Huffman编码
UnPad=2;
h_len=h_len/UnPad;
h_arr=b(1:h_len);
sorted_b=sort(h_arr);%先排序后再统计
k=2;j=1;
rate_b(j)=1;
while(k<=h_len)
if(h_arr(k)==h_arr(k-1))
rate_b(j)=rate_b(j)+1;
CodeTable(j)=sorted_b(k);
elseif(h_arr(k)~=h_arr(k-1))
j=j+1;
rate_b(j)=1;
CodeTable(j)=sorted_b(k);
end
k=k+1;
end
Total_Pix=sum(rate_b);%计算概率,并且百分含量和=1
rate_b=rate_b/Total_Pix;
[sorted_Rate,Index]=sort(rate_b);%对概率做排序,开始Huffman编码
CodeTable=CodeTable(Index);%需要对码值作用做相应的变换,重新排列
[HuffmanCode,l]=Huffman(sorted_Rage);%调用Huffman函数做Huffman编码
TotalLen=l*length(sorted_Rage);
HuffmanTable.CodeTable=CodeTable;%结构体返回查询表
HuffmanTable.HuffmanCode=HuffmanCode;
HuffmanTable.ZipRate=1/(l/8/UnPad);
HuffmanCodeStr=";%根据对应码的结果对zig-zag序列编码
for i=1:h_len
Index=find(CodeTable==h_arr(i));
HuffmanCodeStr=strcat(HuffmanCodeStr,'-',HuffmanCode{Index});
end
function[H,l]=Huffman(p)%实现Huffman编码
if(length(find(p<=0))~=0)
error('Not a prob,negative componemt');
end
if(abs(sum(p)-1)>=10e-10)
error('Not a prob.vector,component do not add to 1')
end
n=length(p);
q=p;
m=zeros(n-1,n);
for i=1:n-1
[q,l]=sort(q);
m(i,:)=[l(1:n-i+1),zeros(1,i-1)];
q=[q(1)+q(2),q(3:n),1];
end
for i=1:n-1
c(i,:)=blanks(n*n);
end
c(n-1,n)='0';
c(n-1,2*n)='1';
for i=2:n-1
c(n-i,1:n-1)=c(n-i+1,n*(find(m(n-i+1,:)==1))-(n-2):n*(find(m(n-i+1,:)==1)));
c(n-i,n)='0';
c(n-i,n+1:2*n-1)=c(n-i,1:n-1);
c(n-i,2*n)='1';
for j=1:i-1
c(n-i,(j+1)*n+1:(j+2)*n)=c(n-i+1,n*(find(m(n-i+1,:)==j+1)-1)+1:n*find(m(n-i+1,:)==j+1));
end
end
for i=1:n
h(i,1:n)=c(1,n*(find(m(1,:)==i)-1)+1:find(m(1,:)==i)*n);
ll(i)=length(find(abs(h(i,:))~=32));
end