一种基于MATLAB的JPEG图像压缩具体实现方法 下载本文

================精选公文范文,管理类,工作总结类,工作计划类文档,欢迎阅读下载==============

0、0、0、0、0、0、0、0、0、2;对该列数通过形成编码获取中间格式即为:、、、、。第一个数为0的个数,第二个数为数值,特殊情况指16个0。 通过该for循环获取AC系数中间格式并保存在向量Rdcts_c_z中,奇数表示0的个数,偶数表示AC系数数值。 表示前两个数 是1,后边共有

16*3+13=61个0,与量化表相同。 熵编码 熵编码可以根据Huffman算法对每个量化后的矩阵进行现场编码,但是这样会增加传输数据,所以这里采用标准HuffmanVLI编码表进行编码,VLI编码表如下: 数值 位数 编码 0 0 0 -1,1 1 0,1 -3,-2,2,3 2 00,01,10,11 -7,-6,-5,-4,4,5,6,7 3 000,001,010,…,101,110,111 -15,…,-8,8,…15 4 0000,0001,…,1110,1111 -31,…,-16,16,…31 5 00000,00001,…,11110,11111 -63,…,-32,32,…63 6 …

--------------------精选公文范文,管理类,工作总结类,工作计划类文档,感谢阅读下载---------------------

~ 6 ~

================精选公文范文,管理类,工作总结类,工作计划类文档,欢迎阅读下载==============

-127,…,-64,64,…127 7 … -255,…,-128,128,…255 8 … -511,…,-256,256,…511 9 … -1023,…,-512,512,…1023 10 … -2047,…,-1024,1024,…2047 11 … … 12 … … 13 … … 14 … … 15 … 熵编码后所得编码即为压缩后的代码,方便存储或者传输。为了便于硬件实现,这里没有涉及到Huffman亮度表,而是依据VLI编码表,通过DC/AC系数的数值确定位数和编码,熵编码上表中的位数和编码两部分组成,即压缩后的编码包括两部分,然后再依据VLI编码表,通过位数和编码返回DC/AC系数,编码中还包含了AC系数中0的个数。0的个数和

位数均用4bit二进制数表示。 r_huff=cell(r_ac_cnt+1,3);%%建立三列矩阵保存压缩后的编码,第一例为0的个数,第二列为编码长度,第三例为编

码 for j=0:1:r_ac_cnt; if j==0 [siz,code]=vli(r_dc_diff); %%通过vli编码函数对DC差值进行编码,获得DC

--------------------精选公文范文,管理类,工作总结类,工作计划类文档,感谢阅读下载---------------------

~ 7 ~

================精选公文范文,管理类,工作总结类,工作计划类文档,欢迎阅读下载==============

差值编码长度和编码,vli函数见附录。 %[siz,code]=vli(r_dc);%%通过vli函数获取AC系数编码及编码长度 r_huff(1,1)=cellstr(dec2bin(0)); %?llstr将二进制字符串转为cell格式放入矩阵 r_huff(1,2)=cellstr(dec2bin(siz,4));%%将哈夫曼编码长度存为4bit r_huff(1,3)=cellstr(dec2bin(code,siz));%%将哈夫曼编码转为二进制 r_code_bit=r_code_bit+siz; %%计算

编码长度 else if r_AC(2*j)==0 r_huff(j+1,1)=cellstr(dec2bin(r_AC(2*j-1),4));%%将0的个数写入第一列 r_huff(j+1,2)=cellstr(dec2bin(0)); r_huff(j+1,3)=cellstr(dec2bin(0)); else r_huff(j+1,1)=cellstr(dec2bin(r_AC(2*j-1)

,4)); [siz,code]=vli(r_AC(2*j)); r_huff(j+1,2)=cellstr(dec2bin(siz,4));

%?编码长度写入第二列 r_huff(j+1,3)=cellstr(dec2bin(code,siz)); %?编码写入第三列 r_code_bit=r_code_bit+siz; %%

--------------------精选公文范文,管理类,工作总结类,工作计划类文档,感谢阅读下载---------------------

~ 8 ~

================精选公文范文,管理类,工作总结类,工作计划类文档,欢迎阅读下载==============

计算编码长度 end end end 压缩后的编码表r_huff如下:此时已将8*8*8=512bit压缩为4+6*8+2+1+1=56bit。 /AC系数Huffman熵解码 i_n=1; for k=1:1:r_ac_cnt+1; if k==1 [i_value]=i_vli(r_huff(1,2),r_huff(1,3)) %%i_vli函数解码,i_vli通过编码长度和编码恢复DC/AC系数真值,函数见附录。 i_Rdcts_c_z(1,i_n)=r_dc+i_value; %i_Rdcts_c_z(1,i_n)=r_huff(1,3);

i_n=i_n+1; r_dc=Rdcts_c_z(1); else if

bin2dec(r_huff(k,1))==15&&bin2dec(r_huff(k,2))==0

i_Rdcts_c_z(1,i_n:i_n+15)=0;%%出现中间格式返16个0 i_n=i_n+16; elseif

bin2dec(r_huff(k,1))==0&&bin2dec(r_huff(k,2))==0

i_Rdcts_c_z(1,i_n)=0; %%出现中间格

~ 9 ~

--------------------精选公文范文,管理类,工作总结类,工作计划类文档,感谢阅读下载---------------------

================精选公文范文,管理类,工作总结类,工作计划类文档,欢迎阅读下载==============

式反1个0,没有具体分析这种情况到底是否存在,但是如果最后一位恰好为0,此时恰好开始新的中间格式计算,i=64时终止计算,则中间格式为 i_n=i_n+1; else i_Rdcts_c_z(1,i_n:i_n+bin2dec(r_huff(k,1))-1)=0;%%哈夫曼编码矩阵r_huff中为二进制数,所以用到了bin2dec i_n=i_n+bin2dec(r_huff(k,1)); %%通过第一列分解重复的0

i_value=i_vli(r_huff(k,2),r_huff(k,3)); %%通过第二三列,编码长度和编码解出AC系数真值 i_Rdcts_c_z(1,i_n)=i_value; %%将解码后的DC/AC系数放入向量i_Rdcts_c_z i_n=i_n+1; end end end 9.反Zig_Zag扫描 i_Rdcts_c=i_Rdcts_c_z(i_zig); %%反zig_zag扫描 i_Rdct_s(1,1:8)=i_Rdcts_c(1:8); %%

~ 10 ~

--------------------精选公文范文,管理类,工作总结类,工作计划类文档,感谢阅读下载---------------------