一種基于MATLAB的JPEG圖像壓縮具體實現(xiàn)方法_第1頁
一種基于MATLAB的JPEG圖像壓縮具體實現(xiàn)方法_第2頁
一種基于MATLAB的JPEG圖像壓縮具體實現(xiàn)方法_第3頁
一種基于MATLAB的JPEG圖像壓縮具體實現(xiàn)方法_第4頁
一種基于MATLAB的JPEG圖像壓縮具體實現(xiàn)方法_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、一種基于MATLAB的JPEG圖像壓縮具體實現(xiàn)方法說明:該方法主要是對FPGA硬件實現(xiàn)編碼白一個驗證,MATLAB處理時盡量選擇了簡單化和接近硬件實現(xiàn)需要。JPEG編碼解碼流程:BMP圖像輸入、8*8分塊、DCT變換、量化、Zig_Zag掃描、獲取DC/AC系數(shù)中間格式、Huffman嫡編碼、DC/AC系數(shù)Huffman嫡解詞,反zig_zag掃描、反量化、反DCT變換、8*8組合、解碼圖像顯示。下面根據(jù)具體代碼解釋實現(xiàn)過程。%讀取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;通過imread函數(shù)獲取BMP圖像的R、G、B三原色矩陣,因為下一步做DCT轉(zhuǎn)換,二DCT函數(shù)要求輸入為正負(fù)值,所以減去128,使得像素點分布范圍變?yōu)?127127,函數(shù)默認(rèn)矩陣A的元素為無符號型(uint8),所以如果直接相減差值為負(fù)時會截取為0,所以先用int16將像素點的值轉(zhuǎn)為帶符號整數(shù)。網(wǎng)上很多都提到了第一步的YUV轉(zhuǎn)換,但是由于MATLAB在實驗時YUV轉(zhuǎn)換后色差失真比較嚴(yán)重,這里沒有進(jìn)行YUV轉(zhuǎn)換。個人理解為YUV轉(zhuǎn)換后經(jīng)過非R/G/B原理顯示器顯

3、示效果可能會比較好,或者如果圖像有色差可以選擇YUV調(diào)整。為了方便,讀入的圖像像素為400*296,是8*8的50*37倍,所以代碼里沒有進(jìn)行8*8的整數(shù)倍調(diào)整。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進(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其中第一個數(shù)-14為DC系數(shù),剩余63個數(shù)為AC系數(shù),左上角低頻,右下角高頻,可以看出量化后已經(jīng)將多數(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:口??诳凇。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ù)減去上一個8*8子塊的DC系數(shù)得到兩DC系數(shù)的差值作

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

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

14、:1:r_ac_cnt;ifj=0siz,code=vli(r_dc_diff);%通過vli編碼函數(shù)對DC差值進(jìn)行編碼,獲得DC差值編碼長度和編碼,vli函數(shù)見附錄。%siz,code=vli(r_dc);%!過vli函數(shù)獲取AC系數(shù)編碼及編碼長度r_huff(1,1)=cellstr(dec2bin(0);%cellstr將二進(jìn)制字符串轉(zhuǎn)為cell格式放入矩陣一r_huff(1,2)=cellstr(dec2bin(siz,4);%等哈夫曼編碼長度存為4bitr_huff(1,3)=cellstr(dec2bin(code,siz);%!哈夫曼編碼轉(zhuǎn)為二進(jìn)制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的個數(shù)寫入第一列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系數(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通過編碼

17、長度和皿恢復(fù)DC/AC系數(shù)真石,函數(shù)見附錄。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個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個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中為二進(jìn)制數(shù),所以用到了bin2deci_n=i_n+bin2dec(r_huff(k,1);%ffi過第一列分解重復(fù)的0i_value=i_vli(r_huff(k,2),r_huff(k,3);%!過第二三列,編碼長度和編碼解出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);疝過而取值的方法進(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為:(可見該矩陣與量化后的矩陣相同)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循環(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)最后通過該語句將每一個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);將矩陣元素設(shè)為無符號整型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的個數(shù)和編碼長度的編碼,壓縮比會稍微降低,該方法所獲得的壓縮率0.2011,即壓縮了近5倍附錄:%乍者:chengbo%能:JPEG圖像壓縮%說明:該程序只是JPEG圖像壓縮算法的簡單驗證,為了便于處理,所壓縮圖像像素為400*296,是8*8的整數(shù)倍,使用標(biāo)準(zhǔn)哈夫曼編碼表編碼和解碼,沒有進(jìn)行顏色修正,所以沒有進(jìn)行YUV轉(zhuǎn)換,直接進(jìn)行RGB編碼壓縮,R/G/B三原色均使用JPEG標(biāo)準(zhǔn)亮度量化矩陣進(jìn)行量化%讀取BMP圖像矩陣%讀取RGB矩陣,由于DCT時輸入為正負(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門=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矩陣進(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的個數(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);%通過vli編碼函數(shù)對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;%計算編碼長度elseifr_AC(2*j)=0r_huff(j+1,1)=c

31、ellstr(dec2bin(r_AC(2*j-1),4);%將0的個數(shù)寫入第一列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編碼長度寫入第二例%AC編碼寫入第三例%十算編碼長度%計算三原色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個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個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中為二進(jìn)制數(shù),所以用到了bin3deci_n=i_n+bin2dec(r_huff(k,1);i_value=i_vli(r_huff(k,2),r_huff(k,3);出編碼真值%通過第一列分解重復(fù)的0%通過第二三列,位數(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變換%各一個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門=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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論