一种基于MATLAB的JPEG图像压缩具体实现方法_第1页
一种基于MATLAB的JPEG图像压缩具体实现方法_第2页
一种基于MATLAB的JPEG图像压缩具体实现方法_第3页
一种基于MATLAB的JPEG图像压缩具体实现方法_第4页
一种基于MATLAB的JPEG图像压缩具体实现方法_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一种基于MATLAB的JPEG图像压缩具体实现方法说明:该方法主要是对FPGA硬件实现编码白一个验证,MATLAB处理时尽量选择了简单化和接近硬件实现需要。JPEG编码解码流程:BMP图像输入、8*8分块、DCT变换、量化、Zig_Zag扫描、获取DC/AC系数中间格式、Huffman嫡编码、DC/AC系数Huffman嫡解词,反zig_zag扫描、反量化、反DCT变换、8*8组合、解码图像显示。下面根据具体代码解释实现过程。%读取BMP图像矩阵%读取RGB巨阵,由于DCT寸输入为正负输入,%使得数据分布范围-1271271.BMP图像输入A=imread('messi_b.bmp&#

2、39;);R=int16(A(:,:,1)-128;G=int16(A(:,:,2)-128;B=int16(A(:,:,3)-128;通过imread函数获取BMP图像的R、G、B三原色矩阵,因为下一步做DCT转换,二DCT函数要求输入为正负值,所以减去128,使得像素点分布范围变为-127127,函数默认矩阵A的元素为无符号型(uint8),所以如果直接相减差值为负时会截取为0,所以先用int16将像素点的值转为带符号整数。网上很多都提到了第一步的YUV转换,但是由于MATLAB在实验时YUV转换后色差失真比较严重,这里没有进行YUV转换。个人理解为YUV转换后经过非R/G/B原理显示器显

3、示效果可能会比较好,或者如果图像有色差可以选择YUV调整。为了方便,读入的图像像素为400*296,是8*8的50*37倍,所以代码里没有进行8*8的整数倍调整。2.8*8分块R_8_8=R(1:8,1:8);喊出一个8*8块这里以R色压缩解码为例,后边解释均为R色编码解码过程,最后附全部代码。R88为:1234S511-24-25-27-27-26必2-21-2S必-2S-27-27-26-2S3-25«27-27-27-27-2J4-24-2Sp笺切凶.前5?8闻8<26-27-30730,骁-33-33-30-31fl刀-29-3B-so羽-13.DCT变换R_DCT=d

4、ct2(R_8_8);使用MATLAB蕊dct2进行DCT变换,也可使用DCT变换矩阵相乘的方法,即R_DCT=A*R_8_8*A,其中A为DCT变换矩阵。R_DCT%:123456?a1-221.00005.07023.6327-G.751C17500-4XO1431156012.7724412936L257S-0,SD110.345-D.36SI-LW9Q-3.O25&13521-U.O4J4-0,5740-码”gsMB20.39154司闰晒-0,61561.52BO-O.71&55-1,J5B70.979115Mo2Mqs-101960.5791IJ50025mQ.151

5、7-O.B63964.37721.06864.1145-1.0741.0030-0.016A1.707672477eO.MJa-O.SOlft-1耶B口的7-0.0621a3123B-3.4BD9-O.3M603931-0,S602-0iM384 .量化R_dct_s=round(R_DCT./S);使用JPECfe准亮晶量化表S量化并取整,S为:1234567a16u一152440512121314It5360314:u15244057前4n222951&780Sia2237%6B109too52435555dBLL(MIB3749T867LOJ121120101372929?9&a

6、mp;112LOG103R_dct_s为:1234S6781-141000D0°鼻100000:050l0o000d40Q00QD0u50000oa0d500aaQ0Q7000°00口ft0000000其中第一个数-14为DC系数,剩余63个数为AC系数,左上角低频,右下角高频,可以看出量化后已经将多数高频量丢弃,从而实现数据压缩。5 .Zig_Zag扫描Rdcts_c=reshape(R_dct_s',1,64);Rdcts_c_z=Rdcts_c(zig);利用reshape函数将量也后的矩阵转为1,64行向量,利用zig向量按位取值,进行Zig_Zag扫描。其

7、中Rdcts_c为:M:口。口口。i。1164位均为0;zig为:zig=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;扫描。6 .获取DC/AC系数的中间格式r_dc_diff=Rdcts_c_z(1)-r_dc;用当前DC系数减去上一个8*8子块的DC系数得到两DC系数的差值作

8、为DC系数中间值,因为图像相邻像素具有很大的相关性,这样做可以减小DC编码长度,进一步压缩代码,在解码的时候通过该差值依次获得各8*8子块DC系数。r_dc=Rdcts_c_z(1);标码之后用公入码将当前DC系数赋给r_dc作为下一次编码时求差值的参考值。fori=2:1:64;ifRdcts_c_z(i)=0&&r_n<15&&i=64r_n=r_n+1;elseifRdcts_c_z(i)=0&&r_n<15&&i=64r_ac_cnt=r_ac_cnt+1;r_AC(1,2*r_ac_cnt-1)=r_n;r_

9、AC(1,2*r_ac_cnt)=Rdcts_c_z(i);r_n=0;elseifRdcts_c_z(i)=0&&r_n<15r_ac_cnt=r_ac_cnt+1;r_AC(1,2*r_ac_cnt-1)=r_n;r_AC(1,2*r_ac_cnt)=Rdcts_c_z(i);r_n=0;elseifRdcts_c_z(i)=0&&r_n=15r_ac_cnt=r_ac_cnt+1;r_AC(1,2*r_ac_cnt-1)=r_n;r_AC(1,2*r_ac_cnt)=Rdcts_c_z(i);r_n=0;elseifRdcts_c_z(i)=0&am

10、p;&r_n=15r_ac_cnt=r_ac_cnt+1;r_AC(1,2*r_ac_cnt-1)=r_n;r_AC(1,2*r_ac_cnt)=Rdcts_c_z(i);r_n=0;endend该for循环用来获取AC系数的中间格式,因为第一个数为DC系数,所以循环从2开始。因为63个AC系数中有很多值为0,所以采用行程编码可以很大的减小编码长度。行程编码是指记录两个非0数之间0的个数,以及非零数的数值,非零数个数和数值为一组中间格式,这里为了计数方便,连续16个0出现时,用(15,0)表示,继续获取下一个AC系数中间格式,也就是说行程编码压缩的最大长度设为16bit,例如数列:1、

11、0、0、-1、0、0、0、0、0、3、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、2;对该列数通过形成编码获取中间格式即为:(0,1)、(2,-1)、(5,3)、(15,0)、(5,2)。第一个数为0的个数,第二个数为数值,特殊情况(15,0)指16个0。通过该for循环获取AC系数中间格式并保存在向量Rdcts_c_z中,奇数表示0的个数,偶数表示AC系数数值。L3$5$丁8。口IE一_.H。口口表示前两个数是1,后边共有16*3+13=61个0,与量化表相同。7.Huffman嫡编码嫡编码可以根据Huffman算法对每个量化后的矩阵进行现场编码,但是

12、这样会增加传输数据(需要传输编码表),所以这里采用标准HuffmanVLI编码表进行编码,VLI编码表如下:数值位数编码0010-1,110,1-3,-2,2,3200,01,10,11-7,-6,-5,-4,4,5,6,73000,001,010,二101,110,111-15j;-8,8j1540000,0001,1110,1111-31j;-16,16,-31500000,00001,11110,11111-63j;-32,32,-636-127j;-64,64j-1277-255j;-128,1282558-511,-,-256,256;5119-1023j;-512,512-1023

13、10-2047,;-1024,1024,204711112131415嫡编码后所得编码即为压缩后的代码,方便存储或者传输。为了便于硬件实现,这里没有涉及到Huffman亮度表,而是依据VLI编码表,通过DC/AC系数的数值确定位数和编码(编码原理),嫡编码由上表中的位数和编码两部分组成,即压缩后的编码包括两部分,然后再依据VLI编码表,通过位数和编码返回DC/AC系数(解码原理),编码中还包含了AC系数中0的个数。0的个数和位数均用4bit二进制数表示。r_huff=cell(r_ac_cnt+1,3);%ft立三列矩阵保存压缩后的编码,第一例为0的个数第二列为输乐度,第三例为编码forj=0

14、:1:r_ac_cnt;ifj=0siz,code=vli(r_dc_diff);%通过vli编码函数对DC差值进行编码,获得DC差值编码长度和编码,vli函数见附录。%siz,code=vli(r_dc);%!过vli函数获取AC系数编码及编码长度r_huff(1,1)=cellstr(dec2bin(0);%cellstr将二进制字符串转为cell格式放入矩阵一r_huff(1,2)=cellstr(dec2bin(siz,4);%等哈夫曼编码长度存为4bitr_huff(1,3)=cellstr(dec2bin(code,siz);%!哈夫曼编码转为二进制r_code_bit=r_cod

15、e_bit+siz;%#算编码长度elseifr_AC(2*j)=0r_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);elser_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);%AC®码长度写入第二列r_huff(j+1,3)=cell

16、str(dec2bin(code,siz);%AC®码写入第三列r_code_bit=r_code_bit+siz;%#算编码长度endendend压缩后的编码表r_huff如下:此时已将8*8*8=512bit压缩为4+6*8+2+1+1=56bit。123|1000100120000000113000000011A11110051111036111100711000Q8 .DC/AC系数Huffman嫡解码i_n=1;fork=1:1:r_ac_cnt+1;ifk=1i_value=i_vli(r_huff(1,2),r_huff(1,3)%i_vli函数解码,i_vli通过编码

17、长度和皿恢复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);elseifbin2dec(r_huff(k,1)=15&&bin2dec(r_huff(k,2)=0i_Rdcts_c_z(1,i_n:i_n+15)=0;%现中间格式(15,0)返16个0i_n=i_n+16;elseifbin2dec(r_huff(k,1)=0&&bin2dec(r_huff(k,2)=0i_Rdcts_c_z(1

18、,i_n)=0;%B现中间格式(0,0)反1个0,没有具体分析这种情对到底是否存在,但是如果最后一位恰好为0,此时恰好开始新的中间格式计算,i=64时终止计算,则中间格式为(0,0)i_n=i_n+1;elsei_Rdcts_c_z(1,i_n:i_n+bin2dec(r_huff(k,1)-1)=0;%贻夫曼编码矩阵r_huff中为二进制数,所以用到了bin2deci_n=i_n+bin2dec(r_huff(k,1);%ffi过第一列分解重复的0i_value=i_vli(r_huff(k,2),r_huff(k,3);%!过第二三列,编码长度和编码解出AC索数真值i_Rdcts_c_z(

19、1,i_n)=i_value;%等解码后的DC/AC家数放入向量i_Rdcts_c_zi_n=i_n+1;endendend9 .反Zig_Zag扫描i_Rdcts_c=i_Rdcts_c_z(i_zig);%zzig_zag扫描i_Rdct_s(1,1:8)=i_Rdcts_c(1:8);%为矩阵形式i_Rdct_s(2,1:8)=i_Rdcts_c(9:16);i_Rdct_s(3,1:8)=i_Rdcts_c(17:24);i_Rdct_s(4,1:8)=i_Rdcts_c(25:32);i_Rdct_s(5,1:8)=i_Rdcts_c(33:40);i_Rdct_s(6,1:8)=i

20、_Rdcts_c(41:48);i_Rdct_s(7,1:8)=i_Rdcts_c(49:56);i_Rdct_s(8,1:8)=i_Rdcts_c(57:64);疝过而取值的方法进行反Zig_Zag扫描,并将扫描获得的向量转为8*8矩阵,其中:i_zag为:i_zig=1,2,6,7,15,16,28,29,3,5,8,14,17,27,30,43,4,9,13,18,26,31,42,44,10,12,19,25,32,41,45,54,11,20,24,33,40,46,53,55,21,23,34,39,47,52,56,61,22,35,38,48,51,57,60,62,36,37

21、,49,50,58,59,63,64;i_Rdct_s为:(可见该矩阵与量化后的矩阵相同)12i4567£1-14100000D21000G0003000n0D00dC00D0DD05a00000口060000QQ007000000090000000o|%5量化并取整%£DCT变换10 .反量化、反DCT变换i_Rdct=round(i_Rdct_s*S);i_R_8_8=round(idct2(i_Rdct);其中i_R_8_8为:(可见与DCT变换前差别不大)1234567&1-24-34-25-26-Z7-2B-3B2-24-25翻27目2&-3S3-

22、25-2526林27翔43q8-272E2929527272721292930e37.建29翔,用利7,德2B-29H-31.同3231M2S-30-303211 .解码图像显示fori_r=1:1:37;fori_c=1:1:50;endend用这样一个嵌套for循环将所有8*8子块进行基于DC位换的JPE编码解码处理,i_R(i_r*8-7:i_r*8,i_c*8-7:i_c*8)=i_R_8_8;在循环最后通过该语句将每一个8*8子块放到i_R矩阵中,然后i_R加128得到解码后R色像素矩阵i_RR分别对G、B像素矩阵做同样算法处理,得到解码后的像素矩阵i_GG、i_BB。i_A(:,:

23、,1)=i_RR;i_A(:,:,2)=i_GG;i_A(:,:,3)=i_BB;%&解码后三元色矩阵放入三维矩阵u_i_A=uint8(i_A);将矩阵元素设为无符号整型imshow(u_i_A);成功!压缩前后卤祢对比:clearall;clc;A=imread('messi_b.bmp');R=int16(A(:,:,1)-128;G=int16(A(:,:,2)-128;B=int16(A(:,:,3)-128;S=1611101624405161;1212141926586055;1413162440576956;1417222951878062;因为没有直接

24、查询Huffman编码表,增加了0的个数和编码长度的编码,压缩比会稍微降低,该方法所获得的压缩率0.2011,即压缩了近5倍附录:%乍者:chengbo%能:JPEG图像压缩%说明:该程序只是JPEG图像压缩算法的简单验证,为了便于处理,所压缩图像像素为400*296,是8*8的整数倍,使用标准哈夫曼编码表编码和解码,没有进行颜色修正,所以没有进行YUV转换,直接进行RGB编码压缩,R/G/B三原色均使用JPEG标准亮度量化矩阵进行量化%读取BMP图像矩阵%读取RGB矩阵,由于DCT时输入为正负输入,%使得数据分布范围-127127%JPE的准亮度量化矩阵182237566810910377;

25、243555648110411392;49647887103121120101;7292959811210010399;zig=0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,zig_zag扫描向量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;i_zig=1,2,6,7,15,16,28,29,3,5,8,14,17,27,

26、30,43,.%反zig_zag扫描向量4,9,13,18,26,31,42,44,10,12,19,25,32,41,45,54,.11,20,24,33,40,46,53,55,21,23,34,39,47,52,56,61,.22,35,38,48,51,57,60,62,36,37,49,50,58,59,63,64;zig=zig+1;r_dc=0;r_n=0;r_AC=zeros;r_all_bit=0;fo门=1:1:37;fori_c=1:1:50;r_ac_cnt=0;R_8_8=R(i_r*8-7:i_r*8,i_c*8-7:i_c*8);%R_DCT=dct2(R_8_8

27、);R_dct_s=round(R_DCT./S);Rdcts_c=reshape(R_dct_s',1,64);%400*296可以分为50*37个8*8子块取出一个8*8块%对这一个8*8矩阵进行DCT变化%量化取整Rdcts_c_z=Rdcts_c(zig);%zig_zag扫描r_dc_diff=Rdcts_c_z(1)-r_dc;%求DC差值%r_dc=Rdcts_c_z(1);fori=2:1:64;%AC编码中间值,奇数为0的个数,偶数为AC数值ifRdcts_c_z(i)=0&&r_n<15&&i=64r_n=r_n+1;elsei

28、fRdcts_c_z(i)=0&&r_n<15&&i=64r_ac_cnt=r_ac_cnt+1;r_AC(1,2*r_ac_cnt-1)=r_n;r_AC(1,2*r_ac_cnt)=Rdcts_c_z(i);r_n=0;elseifRdcts_c_z(i)=0&&r_n<15r_ac_cnt=r_ac_cnt+1;r_AC(1,2*r_ac_cnt-1)=r_n;r_AC(1,2*r_ac_cnt)=Rdcts_c_z(i);r_n=0;elseifRdcts_c_z(i)=0&&r_n=15r_ac_cnt=r_

29、ac_cnt+1;r_AC(1,2*r_ac_cnt-1)=r_n;r_AC(1,2*r_ac_cnt)=Rdcts_c_z(i);r_n=0;elseifRdcts_c_z(i)=0&&r_n=15r_ac_cnt=r_ac_cnt+1;r_AC(1,2*r_ac_cnt-1)=r_n;r_AC(1,2*r_ac_cnt)=Rdcts_c_z(i);r_n=0;endendr_huff=cell(r_ac_cnt+1,3);%艮据中间值查VLI标准编码表进行哈夫曼编码r_code_bit=0;%H为编码后的值为二进制,所以建立cell型矩阵存放要发送编码forj=0:1:r_

30、ac_cnt;ifj=0siz,code=vli(r_dc_diff);%通过vli编码函数对DC差值进行编码%siz,code=vli(r_dc);r_huff(1,1)=cellstr(dec2bin(0);%cellstr将二进制字符串转为cell格式放入矩阵r_huff(1,2)=cellstr(dec2bin(siz,4);%将哈夫曼编码bit数存为4bitr_huff(1,3)=cellstr(dec2bin(code,siz);%将哈夫曼编码转为二进制r_code_bit=r_code_bit+siz;%计算编码长度elseifr_AC(2*j)=0r_huff(j+1,1)=c

31、ellstr(dec2bin(r_AC(2*j-1),4);%将0的个数写入第一列r_huff(j+1,2)=cellstr(dec2bin(0);r_huff(j+1,3)=cellstr(dec2bin(0);elser_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;endendendr_all_bit

32、=r_all_bit+r_ac_cnt*8+4+r_code_bit;数i_n=1;fork=1:1:r_ac_cnt+1;ifk=1i_value=i_vli(r_huff(1,2),r_huff(1,3)i_Rdcts_c_z(1,i_n)=r_dc+i_value;%i_Rdcts_c_z(1,i_n)=r_huff(1,3);%AC编码长度写入第二例%AC编码写入第三例%十算编码长度%计算三原色R压缩后的总编码bit%i_vli函数解码i_n=i_n+1;r_dc=Rdcts_c_z(1);elseifbin2dec(r_huff(k,1)=15&&bin2dec(r_

33、huff(k,2)=0i_Rdcts_c_z(1,i_n:i_n+15)=0;%出现中间格式(15,0)反16个0i_n=i_n+16;elseifbin2dec(r_huff(k,1)=0&&bin2dec(r_huff(k,2)=0i_Rdcts_c_z(1,i_n)=0;%出现中间格式(0,0)反1个0i_n=i_n+1;%没有具体分析这种情况到底是否存在,但是如果最后一位恰好为0,else%t匕时恰好开始新的中间格式计算,i=64时终止计算,则中间格式为(0,0)i_Rdcts_c_z(1,i_n:i_n+bin2dec(r_huff(k,1)-1)=0;%哈夫曼编码矩

34、阵r_huff中为二进制数,所以用到了bin3deci_n=i_n+bin2dec(r_huff(k,1);i_value=i_vli(r_huff(k,2),r_huff(k,3);出编码真值%通过第一列分解重复的0%通过第二三列,位数和编码解i_Rdcts_c_z(1,i_n)=i_value;i_n=i_n+1;endendendi_Rdcts_c=i_Rdcts_c_z(i_zig);i_Rdct_s(1,1:8)=i_Rdcts_c(1:8);i_Rdct_s(2,1:8)=i_Rdcts_c(9:16);i_Rdct_s(3,1:8)=i_Rdcts_c(17:24);i_Rdct

35、_s(4,1:8)=i_Rdcts_c(25:32);i_Rdct_s(5,1:8)=i_Rdcts_c(33:40);i_Rdct_s(6,1:8)=i_Rdcts_c(41:48);i_Rdct_s(7,1:8)=i_Rdcts_c(49:56);i_Rdct_s(8,1:8)=i_Rdcts_c(57:64);i_Rdct=round(i_Rdct_s.*S);i_R_8_8=round(idct2(i_Rdct);i_R(i_r*8-7:i_r*8,i_c*8-7:i_c*8)=i_R_8_8;endendi_RR=i_R+128;%)/zzig_zag扫描%变为矩阵形式%量化并取整%

36、碰DCT变换%各一个8*8子块放回R色新矩阵中%范围调回至0255%后边同理依次为G、B编码和解码g_dc=0;g_n=0;g_AC=zeros;g_all_bit=0;fori_r=1:1:37;fori_c=1:1:50;g_ac_cnt=0;G_8_8=G(i_r*8-7:i_r*8,i_c*8-7:i_c*8);G_DCT=dct2(G_8_8);G_dct_s=round(G_DCT./S);Gdcts_c=reshape(G_dct_s',1,64);Gdcts_c_z=Gdcts_c(zig);g_dc_diff=Gdcts_c_z(1)-g_dc;%g_dc=Gdcts

37、_c_z(1);fori=2:1:64;ifGdcts_c_z(i)=0&&g_n<15&&i=64g_n=g_n+1;elseifGdcts_c_z(i)=0&&g_n<15&&i=64g_ac_cnt=g_ac_cnt+1;g_AC(1,2*g_ac_cnt-1)=g_n;g_AC(1,2*g_ac_cnt尸Gdcts_c_z(i);g_n=0;elseifGdcts_c_z(i)=0&&r_n<15g_ac_cnt=g_ac_cnt+1;g_AC(1,2*g_ac_cnt-1)=g_n;g_

38、AC(1,2*g_ac_cnt尸Gdcts_c_z(i);g_n=0;elseifGdcts_c_z(i)=0&&g_n=15g_ac_cnt=g_ac_cnt+1;g_AC(1,2*g_ac_cnt-1)=g_n;g_AC(1,2*g_ac_cnt尸Gdcts_c_z(i);g_n=0;elseifGdcts_c_z(i)=0&&g_n=15g_ac_cnt=g_ac_cnt+1;g_AC(1,2*g_ac_cnt-1)=g_n;g_AC(1,2*g_ac_cnt尸Gdcts_c_z(i);g_n=0;endendg_huff=cell(g_ac_cnt+1,

39、3);g_code_bit=0;forj=0:1:g_ac_cnt;ifj=0siz,code=vli(g_dc_diff);%siz,code=vli(r_dc);g_huff(1,1)=cellstr(dec2bin(0);g_huff(1,2)=cellstr(dec2bin(siz,4);g_huff(1,3)=cellstr(dec2bin(code,siz);g_code_bit=g_code_bit+siz;elseifg_AC(2*j)=0g_huff(j+1,1)=cellstr(dec2bin(g_AC(2*j-1),4);g_huff(j+1,2)=cellstr(dec

40、2bin(0);g_huff(j+1,3)=cellstr(dec2bin(0);elseg_huff(j+1,1)=cellstr(dec2bin(g_AC(2*j-1),4);siz,code=vli(g_AC(2*j);g_huff(j+1,2)=cellstr(dec2bin(siz,4);g_huff(j+1,3)=cellstr(dec2bin(code,siz);g_code_bit=g_code_bit+siz;endendendg_all_bit=g_all_bit+g_ac_cnt*8+4+g_code_bit;i_n=1;fork=1:1:g_ac_cnt+1;ifk=1

41、i_value=i_vli(g_huff(1,2),g_huff(1,3)i_Gdcts_c_z(1,i_n)=g_dc+i_value;%i_Rdcts_c_z(1,i_n)=r_huff(1,3);i_n=i_n+1;g_dc=Gdcts_c_z(1);elseifbin2dec(g_huff(k,1)=15&&bin2dec(g_huff(k,2)=0i_Gdcts_c_z(1,i_n:i_n+15)=0;i_n=i_n+16;elseifbin2dec(g_huff(k,1)=0&&bin2dec(g_huff(k,2)=0i_Gdcts_c_z(1,i

42、_n)=0;i_n=i_n+1;elsei_Gdcts_c_z(1,i_n:i_n+bin2dec(g_huff(k,1)-1)=0;i_n=i_n+bin2dec(g_huff(k,1);i_value=i_vli(g_huff(k,2),g_huff(k,3);i_Gdcts_c_z(1,i_n)=i_value;i_n=i_n+1;endendendi_Gdcts_c=i_Gdcts_c_z(i_zig);i_Gdct_s(1,1:8)=i_Gdcts_c(1:8);i_Gdct_s(2,1:8)=i_Gdcts_c(9:16);i_Gdct_s(3,1:8)=i_Gdcts_c(17:

43、24);i_Gdct_s(4,1:8)=i_Gdcts_c(25:32);i_Gdct_s(5,1:8)=i_Gdcts_c(33:40);i_Gdct_s(6,1:8)=i_Gdcts_c(41:48);i_Gdct_s(7,1:8)=i_Gdcts_c(49:56);i_Gdct_s(8,1:8)=i_Gdcts_c(57:64);i_Gdct=round(i_Gdct_s.*S);i_G_8_8=round(idct2(i_Gdct);i_G(i_r*8-7:i_r*8,i_c*8-7:i_c*8)=i_G_8_8;endendi_GG=i_G+128;b_dc=0;b_n=0;b_AC

44、=zeros;b_all_bit=0;fo门=1:1:37;fori_c=1:1:50;b_ac_cnt=0;B_8_8=B(i_r*8-7:i_r*8,i_c*8-7:i_c*8);B_DCT=dct2(B_8_8);B_dct_s=round(B_DCT./S);Bdcts_c=reshape(B_dct_s',1,64);Bdcts_c_z=Bdcts_c(zig);b_dc_diff=Bdcts_c_z(1)-b_dc;%b_dc=Bdcts_c_z(1);fori=2:1:64;ifBdcts_c_z(i)=0&&b_n<15&&i=64

45、b_n=b_n+1;elseifBdcts_c_z(i)=0&&b_n<15&&i=64b_ac_cnt=b_ac_cnt+1;b_AC(1,2*b_ac_cnt-1)=b_n;b_AC(1,2*b_ac_cnt)=Bdcts_c_z(i);b_n=0;elseifBdcts_c_z(i)=0&&b_n<15b_ac_cnt=b_ac_cnt+1;b_AC(1,2*b_ac_cnt-1)=b_n;b_AC(1,2*b_ac_cnt)=Bdcts_c_z(i);b_n=0;elseifBdcts_c_z(i)=0&&b_

46、n=15b_ac_cnt=b_ac_cnt+1;b_AC(1,2*b_ac_cnt-1)=b_n;b_AC(1,2*b_ac_cnt)=Bdcts_c_z(i);b_n=0;elseifBdcts_c_z(i)=0&&b_n=15b_ac_cnt=b_ac_cnt+1;b_AC(1,2*b_ac_cnt-1)=b_n;b_AC(1,2*b_ac_cnt)=Bdcts_c_z(i);b_n=0;endendb_huff=cell(b_ac_cnt+1,3);b_code_bit=0;forj=0:1:b_ac_cnt;ifj=0siz,code=vli(b_dc_diff);%siz,code=vli(r_dc);b_huff(1,1)=cellstr(dec2bin(0);b_huff(1,2)=cellstr(dec2bin(siz,4);b_h

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论