资源简介

matlab实现jpeg压缩过程MATLAB程序,包括分块,DCT2D,哈夫曼编码,熵编码

资源截图

代码片段和文件信息

function B=Code_Huffman(A)
%根据huffman编码表对量化后的数据编码
%依次输入DC系数差值(A中DC系数已做过差分)和AC系数的典型Huffman表
%只处理8×8DCT系数量化矩阵
DC_Huff={‘00‘‘010‘‘011‘‘100‘‘101‘‘110‘‘1110‘‘11110‘‘111110‘‘1111110‘‘11111110‘‘111111110‘};
%由于AC系数数据量较大,我们将它保存在AC_Huff.txt文件中,将它读入元胞数组中
fid=fopen(‘AC_Huff.txt‘‘r‘);
AC_Huff=cell(1610);
for a=1:16
    for b=1:10
        temp=fscanf(fid‘%s‘1);
        AC_Huff(ab)={temp};
    end
end
fclose(fid);
%对A中的数据进行Zig-Zag扫描%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
i=1;
for a=1:15
    if a<=8
        for b=1:a
            if mod(a2)==1
               Z(i)=A(ba+1-b);
               i=i+1;
            else
               Z(i)=A(a+1-bb);
               i=i+1;
            end
            
        end
    else
        for b=1:16-a
            if mod(a2)==0
               Z(i)=A(9-ba+b-8);
               i=i+1;
            else
               Z(i)=A(a+b-89-b);
               i=i+1;
            end                              
        end
    end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%先对DC差值系数编码:前缀码SSSS+尾码
%dc为其Huffman编码
if Z(1)==0
    sa.s=DC_Huff(1);   %%%size分量存放前缀码
    sa.a=‘0‘;           %%%amp分量存放尾码
    dc=strcat(sa.ssa.a);
else    
    n=fix(log2(abs(Z(1))))+1;
    sa.s=DC_Huff(n);
    sa.a=binCode(Z(1));
    dc=strcat(sa.ssa.a);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%再对AC系数进行行程编码保存在结构体数组rsa中
if isempty(find(Z(2:end)))  %如果63个交流系数全部为0,rsa系数全部为0
    rsa(1).r=0;             %行程runlength
    rsa(1).s=0;             %码长size
    rsa(1).a=0;             %二进制编码
else
   T=find(Z);              %找出Z中非零元素的下标
   T=[0 T(2:end)];         %为统一处理将第一个下标元素置为0
   i=1;                    % i为rsa结构体的下标  
   %从第二个元素即第一个交流元素开始处理
   j=2;
   while j<=length(T)
       t=fix((T(j)-1-T(j-1))/16);   %判断下标间隔是否超过16
       if t==0                      %如果小于16,较简单
           rsa(i).r=T(j)-T(j-1)-1;
           rsa(i).s=fix(log2(abs(Z(T(j)))))+1;
           rsa(i).a=Z(T(j));
           i=i+1;
       else                         %如果超过16,需要处理(15,0)的特殊情况
           for n=1:t                %可能出现t组(15,0) 
               rsa(i)=struct(‘r‘15‘s‘0‘a‘0);
               i=i+1;
           end
           %接着处理剩余的那部分
           rsa(i).r=T(j)-1-16*t;
           rsa(i).s=fix(log2(abs(Z(T(j)))))+1;
           rsa(i).a=Z(T(j));
           i=i+1;
       end
       j=j+1;
   end
   %判断最后一个非零元素是否为Z中最后一个元素
   if T(end)<64
       rsa(i).r=0;
       rsa(i).s=0;
       rsa(i).a=0;
   end                      %以EOB结束
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%---------通过查表获取AC系数的Huffman编码

B=dc;                         %B初始化为直流系数编码
for n=1:length(rsa)
    if rsa(n).r==0&rsa(n).s==0&rsa(n).a==0
        ac(n)={‘1010‘};  
    elseif rsa(n).r==15&rsa(n).s==0&rsa(n).a==0
        ac(n)={‘11111111001‘};
    else
        t1=AC_Huff(rsa(n).s+1rsa(n).s);  %应该为 rsa(

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2009-03-17 16:38  matlab实现jpeg压缩过程_MATLAB程序\
     文件       66616  2006-05-10 23:24  matlab实现jpeg压缩过程_MATLAB程序\1.bmp
     文件        6642  2006-05-29 21:42  matlab实现jpeg压缩过程_MATLAB程序\AC_Huff.txt
     文件        3950  2009-03-21 13:08  matlab实现jpeg压缩过程_MATLAB程序\Code_Huffman.m
     文件        1535  2009-03-12 14:17  matlab实现jpeg压缩过程_MATLAB程序\DCT2D.asv
     文件        1563  2009-03-12 14:18  matlab实现jpeg压缩过程_MATLAB程序\DCT2D.m
     文件         508  2006-05-28 22:09  matlab实现jpeg压缩过程_MATLAB程序\DCT_Measure.m
     文件       85972  2009-03-17 16:38  matlab实现jpeg压缩过程_MATLAB程序\JPGCode.txt
     文件        1070  2006-05-31 22:57  matlab实现jpeg压缩过程_MATLAB程序\JPGCompress.m
     文件       66614  2009-03-11 16:20  matlab实现jpeg压缩过程_MATLAB程序\Lena.bmp

评论

共有 条评论