一種基于MATLAB的JPEG圖像壓縮具體實(shí)現(xiàn)方法_第1頁(yè)
一種基于MATLAB的JPEG圖像壓縮具體實(shí)現(xiàn)方法_第2頁(yè)
一種基于MATLAB的JPEG圖像壓縮具體實(shí)現(xiàn)方法_第3頁(yè)
一種基于MATLAB的JPEG圖像壓縮具體實(shí)現(xiàn)方法_第4頁(yè)
一種基于MATLAB的JPEG圖像壓縮具體實(shí)現(xiàn)方法_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余10頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、一種基于MATLAB的JPEG圖像壓縮具體實(shí)現(xiàn)方法說(shuō)明:該方法主要是對(duì)FPGA硬件實(shí)現(xiàn)編碼白一個(gè)驗(yàn)證,MATLAB處理時(shí)盡量選擇了簡(jiǎn)單化和接近硬件實(shí)現(xiàn)需要。JPEG編碼解碼流程:BMP圖像輸入、8*8分塊、DCT變換、量化、Zig_Zag掃描、獲取DC/AC系數(shù)中間格式、Huffman嫡編碼、DC/AC系數(shù)Huffman嫡解詞,反zig_zag掃描、反量化、反DCT變換、8*8組合、解碼圖像顯示。下面根據(jù)具體代碼解釋實(shí)現(xiàn)過(guò)程。%讀取BMP圖像矩陣%讀取RGB巨陣,由于DCT寸輸入為正負(fù)輸入,%使得數(shù)據(jù)分布范圍-1271271.BMP圖像輸入A=imread('messi_b.bmp&#

2、39;);R=int16(A(:,:,1)-128;G=int16(A(:,:,2)-128;B=int16(A(:,:,3)-128;通過(guò)imread函數(shù)獲取BMP圖像的R、G、B三原色矩陣,因?yàn)橄乱徊阶鯠CT轉(zhuǎn)換,二DCT函數(shù)要求輸入為正負(fù)值,所以減去128,使得像素點(diǎn)分布范圍變?yōu)?127127,函數(shù)默認(rèn)矩陣A的元素為無(wú)符號(hào)型(uint8),所以如果直接相減差值為負(fù)時(shí)會(huì)截取為0,所以先用int16將像素點(diǎn)的值轉(zhuǎn)為帶符號(hào)整數(shù)。網(wǎng)上很多都提到了第一步的YUV轉(zhuǎn)換,但是由于MATLAB在實(shí)驗(yàn)時(shí)YUV轉(zhuǎn)換后色差失真比較嚴(yán)重,這里沒(méi)有進(jìn)行YUV轉(zhuǎn)換。個(gè)人理解為YUV轉(zhuǎn)換后經(jīng)過(guò)非R/G/B原理顯示器顯

3、示效果可能會(huì)比較好,或者如果圖像有色差可以選擇YUV調(diào)整。為了方便,讀入的圖像像素為400*296,是8*8的50*37倍,所以代碼里沒(méi)有進(jìn)行8*8的整數(shù)倍調(diào)整。2.8*8分塊R_8_8=R(1:8,1:8);喊出一個(gè)8*8塊這里以R色壓縮解碼為例,后邊解釋均為R色編碼解碼過(guò)程,最后附全部代碼。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進(jìn)行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準(zhǔn)亮晶量化表S量化并取整,S為:1234567a16u一152440512121314It5360314:u15244057前4n222951&780Sia2237%6B109too52435555dBLL(MIB3749T867LOJ121120101372929?9&a

6、mp;112LOG103R_dct_s為:1234S6781-141000D0°鼻100000:050l0o000d40Q00QD0u50000oa0d500aaQ0Q7000°00口ft0000000其中第一個(gè)數(shù)-14為DC系數(shù),剩余63個(gè)數(shù)為AC系數(shù),左上角低頻,右下角高頻,可以看出量化后已經(jīng)將多數(shù)高頻量丟棄,從而實(shí)現(xiàn)數(shù)據(jù)壓縮。5 .Zig_Zag掃描Rdcts_c=reshape(R_dct_s',1,64);Rdcts_c_z=Rdcts_c(zig);利用reshape函數(shù)將量也后的矩陣轉(zhuǎn)為1,64行向量,利用zig向量按位取值,進(jìn)行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系數(shù)的中間格式r_dc_diff=Rdcts_c_z(1)-r_dc;用當(dāng)前DC系數(shù)減去上一個(gè)8*8子塊的DC系數(shù)得到兩DC系數(shù)的差值作

8、為DC系數(shù)中間值,因?yàn)閳D像相鄰像素具有很大的相關(guān)性,這樣做可以減小DC編碼長(zhǎng)度,進(jìn)一步壓縮代碼,在解碼的時(shí)候通過(guò)該差值依次獲得各8*8子塊DC系數(shù)。r_dc=Rdcts_c_z(1);標(biāo)碼之后用公入碼將當(dāng)前DC系數(shù)賦給r_dc作為下一次編碼時(shí)求差值的參考值。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循環(huán)用來(lái)獲取AC系數(shù)的中間格式,因?yàn)榈谝粋€(gè)數(shù)為DC系數(shù),所以循環(huán)從2開(kāi)始。因?yàn)?3個(gè)AC系數(shù)中有很多值為0,所以采用行程編碼可以很大的減小編碼長(zhǎng)度。行程編碼是指記錄兩個(gè)非0數(shù)之間0的個(gè)數(shù),以及非零數(shù)的數(shù)值,非零數(shù)個(gè)數(shù)和數(shù)值為一組中間格式,這里為了計(jì)數(shù)方便,連續(xù)16個(gè)0出現(xiàn)時(shí),用(15,0)表示,繼續(xù)獲取下一個(gè)AC系數(shù)中間格式,也就是說(shuō)行程編碼壓縮的最大長(zhǎng)度設(shè)為16bit,例如數(shù)列: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;對(duì)該列數(shù)通過(guò)形成編碼獲取中間格式即為:(0,1)、(2,-1)、(5,3)、(15,0)、(5,2)。第一個(gè)數(shù)為0的個(gè)數(shù),第二個(gè)數(shù)為數(shù)值,特殊情況(15,0)指16個(gè)0。通過(guò)該for循環(huán)獲取AC系數(shù)中間格式并保存在向量Rdcts_c_z中,奇數(shù)表示0的個(gè)數(shù),偶數(shù)表示AC系數(shù)數(shù)值。L3$5$丁8??贗E一_.H??诳诒硎厩皟蓚€(gè)數(shù)是1,后邊共有16*3+13=61個(gè)0,與量化表相同。7.Huffman嫡編碼嫡編碼可以根據(jù)Huffman算法對(duì)每個(gè)量化后的矩陣進(jìn)行現(xiàn)場(chǎng)編碼,但是

12、這樣會(huì)增加傳輸數(shù)據(jù)(需要傳輸編碼表),所以這里采用標(biāo)準(zhǔn)HuffmanVLI編碼表進(jìn)行編碼,VLI編碼表如下:數(shù)值位數(shù)編碼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嫡編碼后所得編碼即為壓縮后的代碼,方便存儲(chǔ)或者傳輸。為了便于硬件實(shí)現(xiàn),這里沒(méi)有涉及到Huffman亮度表,而是依據(jù)VLI編碼表,通過(guò)DC/AC系數(shù)的數(shù)值確定位數(shù)和編碼(編碼原理),嫡編碼由上表中的位數(shù)和編碼兩部分組成,即壓縮后的編碼包括兩部分,然后再依據(jù)VLI編碼表,通過(guò)位數(shù)和編碼返回DC/AC系數(shù)(解碼原理),編碼中還包含了AC系數(shù)中0的個(gè)數(shù)。0的個(gè)數(shù)和位數(shù)均用4bit二進(jìn)制數(shù)表示。r_huff=cell(r_ac_cnt+1,3);%ft立三列矩陣保存壓縮后的編碼,第一例為0的個(gè)數(shù)第二列為輸樂(lè)度,第三例為編碼forj=0

14、:1:r_ac_cnt;ifj=0siz,code=vli(r_dc_diff);%通過(guò)vli編碼函數(shù)對(duì)DC差值進(jìn)行編碼,獲得DC差值編碼長(zhǎng)度和編碼,vli函數(shù)見(jiàn)附錄。%siz,code=vli(r_dc);%!過(guò)vli函數(shù)獲取AC系數(shù)編碼及編碼長(zhǎng)度r_huff(1,1)=cellstr(dec2bin(0);%cellstr將二進(jìn)制字符串轉(zhuǎn)為cell格式放入矩陣一r_huff(1,2)=cellstr(dec2bin(siz,4);%等哈夫曼編碼長(zhǎng)度存為4bitr_huff(1,3)=cellstr(dec2bin(code,siz);%!哈夫曼編碼轉(zhuǎn)為二進(jìn)制r_code_bit=r_cod

15、e_bit+siz;%#算編碼長(zhǎng)度elseifr_AC(2*j)=0r_huff(j+1,1)=cellstr(dec2bin(r_AC(2*j-1),4);%等0的個(gè)數(shù)寫(xiě)入第一列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®碼長(zhǎng)度寫(xiě)入第二列r_huff(j+1,3)=cell

16、str(dec2bin(code,siz);%AC®碼寫(xiě)入第三列r_code_bit=r_code_bit+siz;%#算編碼長(zhǎng)度endendend壓縮后的編碼表r_huff如下:此時(shí)已將8*8*8=512bit壓縮為4+6*8+2+1+1=56bit。123|1000100120000000113000000011A11110051111036111100711000Q8 .DC/AC系數(shù)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函數(shù)解碼,i_vli通過(guò)編碼

17、長(zhǎng)度和皿恢復(fù)DC/AC系數(shù)真石,函數(shù)見(jiàn)附錄。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;%現(xiàn)中間格式(15,0)返16個(gè)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現(xiàn)中間格式(0,0)反1個(gè)0,沒(méi)有具體分析這種情對(duì)到底是否存在,但是如果最后一位恰好為0,此時(shí)恰好開(kāi)始新的中間格式計(jì)算,i=64時(shí)終止計(jì)算,則中間格式為(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中為二進(jìn)制數(shù),所以用到了bin2deci_n=i_n+bin2dec(r_huff(k,1);%ffi過(guò)第一列分解重復(fù)的0i_value=i_vli(r_huff(k,2),r_huff(k,3);%!過(guò)第二三列,編碼長(zhǎng)度和編碼解出AC索數(shù)真值i_Rdcts_c_z(

19、1,i_n)=i_value;%等解碼后的DC/AC家數(shù)放入向量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);疝過(guò)而取值的方法進(jìn)行反Zig_Zag掃描,并將掃描獲得的向量轉(zhuǎn)為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為:(可見(jiàn)該矩陣與量化后的矩陣相同)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為:(可見(jiàn)與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用這樣一個(gè)嵌套for循環(huán)將所有8*8子塊進(jìn)行基于DC位換的JPE編碼解碼處理,i_R(i_r*8-7:i_r*8,i_c*8-7:i_c*8)=i_R_8_8;在循環(huán)最后通過(guò)該語(yǔ)句將每一個(gè)8*8子塊放到i_R矩陣中,然后i_R加128得到解碼后R色像素矩陣i_RR分別對(duì)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);將矩陣元素設(shè)為無(wú)符號(hào)整型imshow(u_i_A);成功!壓縮前后鹵禰對(duì)比: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;因?yàn)闆](méi)有直接

24、查詢(xún)Huffman編碼表,增加了0的個(gè)數(shù)和編碼長(zhǎng)度的編碼,壓縮比會(huì)稍微降低,該方法所獲得的壓縮率0.2011,即壓縮了近5倍附錄:%乍者:chengbo%能:JPEG圖像壓縮%說(shuō)明:該程序只是JPEG圖像壓縮算法的簡(jiǎn)單驗(yàn)證,為了便于處理,所壓縮圖像像素為400*296,是8*8的整數(shù)倍,使用標(biāo)準(zhǔn)哈夫曼編碼表編碼和解碼,沒(méi)有進(jìn)行顏色修正,所以沒(méi)有進(jìn)行YUV轉(zhuǎn)換,直接進(jìn)行RGB編碼壓縮,R/G/B三原色均使用JPEG標(biāo)準(zhǔn)亮度量化矩陣進(jìn)行量化%讀取BMP圖像矩陣%讀取RGB矩陣,由于DCT時(shí)輸入為正負(fù)輸入,%使得數(shù)據(jù)分布范圍-127127%JPE的準(zhǔn)亮度量化矩陣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門(mén)=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個(gè)8*8子塊取出一個(gè)8*8塊%對(duì)這一個(gè)8*8矩陣進(jìn)行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編碼中間值,奇數(shù)為0的個(gè)數(shù),偶數(shù)為AC數(shù)值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);%艮據(jù)中間值查VLI標(biāo)準(zhǔn)編碼表進(jìn)行哈夫曼編碼r_code_bit=0;%H為編碼后的值為二進(jìn)制,所以建立cell型矩陣存放要發(fā)送編碼forj=0:1:r_

30、ac_cnt;ifj=0siz,code=vli(r_dc_diff);%通過(guò)vli編碼函數(shù)對(duì)DC差值進(jìn)行編碼%siz,code=vli(r_dc);r_huff(1,1)=cellstr(dec2bin(0);%cellstr將二進(jìn)制字符串轉(zhuǎn)為cell格式放入矩陣r_huff(1,2)=cellstr(dec2bin(siz,4);%將哈夫曼編碼bit數(shù)存為4bitr_huff(1,3)=cellstr(dec2bin(code,siz);%將哈夫曼編碼轉(zhuǎn)為二進(jìn)制r_code_bit=r_code_bit+siz;%計(jì)算編碼長(zhǎng)度elseifr_AC(2*j)=0r_huff(j+1,1)=c

31、ellstr(dec2bin(r_AC(2*j-1),4);%將0的個(gè)數(shù)寫(xiě)入第一列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;數(shù)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編碼長(zhǎng)度寫(xiě)入第二例%AC編碼寫(xiě)入第三例%十算編碼長(zhǎng)度%計(jì)算三原色R壓縮后的總編碼bit%i_vli函數(shù)解碼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;%出現(xiàn)中間格式(15,0)反16個(gè)0i_n=i_n+16;elseifbin2dec(r_huff(k,1)=0&&bin2dec(r_huff(k,2)=0i_Rdcts_c_z(1,i_n)=0;%出現(xiàn)中間格式(0,0)反1個(gè)0i_n=i_n+1;%沒(méi)有具體分析這種情況到底是否存在,但是如果最后一位恰好為0,else%t匕時(shí)恰好開(kāi)始新的中間格式計(jì)算,i=64時(shí)終止計(jì)算,則中間格式為(0,0)i_Rdcts_c_z(1,i_n:i_n+bin2dec(r_huff(k,1)-1)=0;%哈夫曼編碼矩

34、陣r_huff中為二進(jìn)制數(shù),所以用到了bin3deci_n=i_n+bin2dec(r_huff(k,1);i_value=i_vli(r_huff(k,2),r_huff(k,3);出編碼真值%通過(guò)第一列分解重復(fù)的0%通過(guò)第二三列,位數(shù)和編碼解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掃描%變?yōu)榫仃囆问?量化并取整%

36、碰DCT變換%各一個(gè)8*8子塊放回R色新矩陣中%范圍調(diào)回至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門(mén)=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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論