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

下載本文檔

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

文檔簡介

1、一種基于MATLAB的JPEG圖像壓縮具體實(shí)現(xiàn)方法說明:該方法主要是對FPGA硬件實(shí)現(xiàn)編碼的一個驗(yàn)證,MATLAB處理時盡量選擇了簡單化和接近硬件實(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)過程。1.BMP圖像輸入A=imread('messi_b.bmp'); %讀取BMP圖像矩陣R=int16(A(:,:,1)-128; %讀取RGB矩陣,由于

2、DCT時輸入為正負(fù)輸入,G=int16(A(:,:,2)-128; %使得數(shù)據(jù)分布范圍-127127B=int16(A(:,:,3)-128;通過imread函數(shù)獲取BMP圖像的R、G、B三原色矩陣,因?yàn)橄乱徊阶鯠CT轉(zhuǎn)換,二DCT函數(shù)要求輸入為正負(fù)值,所以減去128,使得像素點(diǎn)分布范圍變?yōu)?127127,函數(shù)默認(rèn)矩陣A的元素為無符號型(uint8),所以如果直接相減差值為負(fù)時會截取為0,所以先用int16將像素點(diǎn)的值轉(zhuǎn)為帶符號整數(shù)。網(wǎng)上很多都提到了第一步的YUV轉(zhuǎn)換,但是由于MATLAB在實(shí)驗(yàn)時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色編碼解碼過程,最后附全部代碼。R_8_8為:3.DCT變換R_DCT=dct2(R_8_8);使用MATLAB函數(shù)dct2進(jìn)行DCT變換,也可使用DCT變換矩陣相乘的方法,即R_DCT=A* R_8_8*AT,其中A為DCT變換矩陣。R_DCT為:4.量化R_dct_s=round(R_DCT./S); 使用JPEG標(biāo)準(zhǔn)亮

4、度量化表S量化并取整,S為:R_dct_s為:其中第一個數(shù)-14為DC系數(shù),剩余63個數(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掃描。其中Rdcts_c為: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,4

5、1,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;Zig_Zag掃描后的向量Rdcts_c_z為:1164位均為0;可以看出通過zig向量按位取值準(zhǔn)確實(shí)現(xiàn)了對量化后DC,AC系數(shù)的Zig_Zag掃描。6.獲取DC/AC系數(shù)的中間格式r_dc_diff=Rdcts_c_z(1)-r_dc;用當(dāng)前DC系數(shù)減去上一個8*8子塊的DC系數(shù)得到兩DC系數(shù)的差值作為DC系數(shù)中間值,因?yàn)閳D像相鄰像素具有很大的相關(guān)性

6、,這樣做可以減小DC編碼長度,進(jìn)一步壓縮代碼,在解碼的時候通過該差值依次獲得各8*8子塊DC系數(shù)。r_dc=Rdcts_c_z(1);解碼之后用該代碼將當(dāng)前DC系數(shù)賦給r_dc作為下一次編碼時求差值的參考值。for i=2:1:64; if Rdcts_c_z(i)=0&&r_n<15&&i=64 r_n=r_n+1;elseif Rdcts_c_z(i)=0&&r_n<15&&i=64 r_ac_cnt=r_ac_cnt+1; r_AC(1,2*r_ac_cnt-1)=r_n; r_AC(1,2*r_ac_cnt)=

7、Rdcts_c_z(i); r_n=0;elseif Rdcts_c_z(i)=0&&r_n<15 r_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;elseif Rdcts_c_z(i)=0&&r_n=15 r_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;elseif Rdcts_c_z(i)=0&&am

8、p;r_n=15 r_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ù)的中間格式,因?yàn)榈谝粋€數(shù)為DC系數(shù),所以循環(huán)從2開始。因?yàn)?3個AC系數(shù)中有很多值為0,所以采用行程編碼可以很大的減小編碼長度。行程編碼是指記錄兩個非0數(shù)之間0的個數(shù),以及非零數(shù)的數(shù)值,非零數(shù)個數(shù)和數(shù)值為一組中間格式,這里為了計(jì)數(shù)方便,連續(xù)16個0出現(xiàn)時,用(15,0)表示,繼續(xù)獲取下一個AC系數(shù)中間格式,也就是說行程編碼壓縮的最大長度設(shè)為16bit,例如數(shù)列:1、0

9、、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ù)值。表示前兩個數(shù)是1,后邊共有16*3+13=61個0,與量化表相同。7. Huffman熵編碼熵編碼可以根據(jù)Huffman算法對每個量化后的矩陣進(jìn)行現(xiàn)場編碼,但是這樣會增加傳輸數(shù)據(jù)(需要傳輸編碼表)

10、,所以這里采用標(biāo)準(zhǔn)HuffmanVLI編碼表進(jìn)行編碼,VLI編碼表如下:數(shù)值位數(shù)編碼000-1,110,1-3,-2,2,3200,01,10,11-7,-6,-5,-4,4,5,6,73000,001,010,101,110,111-15,-8,8,1540000,0001,1110,1111-31,-16,16,31500000,00001,11110,11111-63,-32,32,636-127,-64,64,1277-255,-128,128,2558-511,-256,256,5119-1023,-512,512,102310-2047,-1024,1024,20471112131

11、415熵編碼后所得編碼即為壓縮后的代碼,方便存儲或者傳輸。為了便于硬件實(shí)現(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);%建立三列矩陣保存壓縮后的編碼,第一例為0的個數(shù),第二列為編碼長度,第三例為編碼 for j=0:1:r_ac_cnt;if j=0 siz,code=v

12、li(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);%將哈夫曼編碼長度存為4bit r_huff(1,3)=cellstr(dec2bin(code,siz);%將哈夫曼編碼轉(zhuǎn)為二進(jìn)制 r_code_bit=r_code_bit+siz; %計(jì)算編碼長度els

13、e if r_AC(2*j)=0 r_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); 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); %AC編碼長度寫入第二列 r_huff(j+1,3)=cellstr(dec2bin(co

14、de,siz); %AC編碼寫入第三列 r_code_bit=r_code_bit+siz; %計(jì)算編碼長度 endendend壓縮后的編碼表r_huff如下:此時已將8*8*8=512bit壓縮為4+6*8+2+1+1=56bit。8.DC/AC系數(shù)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函數(shù)解碼,i_vli通過編碼長度和編碼恢復(fù)DC/AC系數(shù)真值,函數(shù)見附錄。 i_Rdcts_c_z(1,i_n)=r_dc+i_value; %i_Rdcts_c_z(1

15、,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;%出現(xià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; %出現(xiàn)中間格式(0,0)反1個0,沒有具體分析這種情況到底是否存在,但是如果最后一位恰好為0,此

16、時恰好開始新的中間格式計(jì)算,i=64時終止計(jì)算,則中間格式為(0,0) i_n=i_n+1; else i_Rdcts_c_z(1,i_n:i_n+bin2dec(r_huff(k,1)-1)=0;%哈夫曼編碼矩陣r_huff中為二進(jìn)制數(shù),所以用到了bin2dec i_n=i_n+bin2dec(r_huff(k,1); %通過第一列分解重復(fù)的0 i_value=i_vli(r_huff(k,2),r_huff(k,3); %通過第二三列,編碼長度和編碼解出AC系數(shù)真值 i_Rdcts_c_z(1,i_n)=i_value;%將解碼后的DC/AC系數(shù)放入向量i_Rdcts_c_z i_n=i_

17、n+1; end endend9.反Zig_Zag掃描i_Rdcts_c=i_Rdcts_c_z(i_zig); %反zig_zag掃描i_Rdct_s(1,1:8)=i_Rdcts_c(1:8); %變?yōu)榫仃囆问絠_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_Rdcts_c(41:48);i_Rdct_s(7,1:8)=i_Rdcts_c(49:

18、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,49,50,58,59,63,64;i_Rdct_s為:(可見該矩陣與量化后的矩陣相同

19、)10.反量化、反DCT變換i_Rdct=round(i_Rdct_s.*S); %反量化并取整i_R_8_8=round(idct2(i_Rdct); %逆DCT變換其中i_R_8_8為:(可見與DCT變換前差別不大)11.解碼圖像顯示for i_r=1:1:37; for i_c=1:1:50;endend用這樣一個嵌套for循環(huán)將所有8*8子塊進(jìn)行基于DCT變換的JPEG編碼解碼處理,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像素

20、矩陣做同樣算法處理,得到解碼后的像素矩陣i_GG、i_BB。i_A(:,:,1)=i_RR;i_A(:,:,2)=i_GG;i_A(:,:,3)=i_BB;%將解碼后三元色矩陣放入三維矩陣u_i_A=uint8(i_A);將矩陣元素設(shè)為無符號整型imshow(u_i_A);成功!壓縮前后圖像對比: 因?yàn)闆]有直接查詢Huffman編碼表,增加了0的個數(shù)和編碼長度的編碼,壓縮比會稍微降低,該方法所獲得的壓縮率0.2011,即壓縮了近5倍。附錄:%作者:chengbo%功能:JPEG圖像壓縮%說明:該程序只是JPEG圖像壓縮算法的簡單驗(yàn)證,為了便于處理,所壓縮圖像像素為400*296,是8*8的整數(shù)

21、倍,使用標(biāo)準(zhǔn)哈夫曼編碼表編碼和解碼,沒有進(jìn)行顏色修正,所以沒有進(jìn)行YUV轉(zhuǎn)換,直接進(jìn)行RGB編碼壓縮,R/G/B三原色均使用JPEG標(biāo)準(zhǔn)亮度量化矩陣進(jìn)行量化clear all;clc;A=imread('messi_b.bmp'); %讀取BMP圖像矩陣R=int16(A(:,:,1)-128; %讀取RGB矩陣,由于DCT時輸入為正負(fù)輸入,G=int16(A(:,:,2)-128; %使得數(shù)據(jù)分布范圍-127127B=int16(A(:,:,3)-128;S=16 11 10 16 24 40 51 61; %JPEG標(biāo)準(zhǔn)亮度量化矩陣 12 12 14 19 26 58 60

22、 55; 14 13 16 24 40 57 69 56; 14 17 22 29 51 87 80 62; 18 22 37 56 68 109 103 77; 24 35 55 64 81 104 113 92; 49 64 78 87 103 121 120 101; 72 92 95 98 112 100 103 99;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,2

23、2,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,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=

24、0;r_AC=zeros;r_all_bit=0;for i_r=1:1:37; %400*296可以分為50*37個8*8子塊 for i_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);%取出一個8*8塊R_DCT=dct2(R_8_8); %對這一個8*8矩陣進(jìn)行DCT變化R_dct_s=round(R_DCT./S); %量化取整Rdcts_c=reshape(R_dct_s',1,64); Rdcts_c_z=Rdcts_c(zig); %zig_zag掃描r_dc_diff=Rdcts_c_z(1)-r_dc

25、; %求DC差值%r_dc=Rdcts_c_z(1);for i=2:1:64; %AC編碼中間值,奇數(shù)為0的個數(shù),偶數(shù)為AC數(shù)值if Rdcts_c_z(i)=0&&r_n<15&&i=64 r_n=r_n+1;elseif Rdcts_c_z(i)=0&&r_n<15&&i=64 r_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;elseif Rdcts_c_z(i)=0&&r_

26、n<15 r_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;elseif Rdcts_c_z(i)=0&&r_n=15 r_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;elseif Rdcts_c_z(i)=0&&r_n=15 r_ac_cnt=r_ac_cnt+1; r_AC(1,2*r_ac_cnt-1)=r_

27、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; %因?yàn)榫幋a后的值為二進(jìn)制,所以建立cell型矩陣存放要發(fā)送編碼for j=0:1:r_ac_cnt;if j=0 siz,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

28、(1,2)=cellstr(dec2bin(siz,4);%將哈夫曼編碼bit數(shù)存為4bit r_huff(1,3)=cellstr(dec2bin(code,siz);%將哈夫曼編碼轉(zhuǎn)為二進(jìn)制 r_code_bit=r_code_bit+siz; %計(jì)算編碼長度else if r_AC(2*j)=0 r_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); else r_huff(j+1,1)=cell

29、str(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)=cellstr(dec2bin(code,siz); %AC編碼寫入第三例 r_code_bit=r_code_bit+siz; %計(jì)算編碼長度 endendendr_all_bit=r_all_bit+r_ac_cnt*8+4+r_code_bit; %計(jì)算三原色R壓縮后的總編碼bit數(shù)i_n=1;for k=1:1:r_ac_cnt+1; if k=1 i_v

30、alue=i_vli(r_huff(1,2),r_huff(1,3) %i_vli函數(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); 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; %出現(xiàn)中間格式(15,0)反16個0 i_n=i_n+16; elseif bin2dec(r_huff(k,1)=0&&am

31、p;bin2dec(r_huff(k,2)=0 i_Rdcts_c_z(1,i_n)=0; %出現(xiàn)中間格式(0,0)反1個0 i_n=i_n+1; %沒有具體分析這種情況到底是否存在,但是如果最后一位恰好為0, else %此時恰好開始新的中間格式計(jì)算,i=64時終止計(jì)算,則中間格式為(0,0) i_Rdcts_c_z(1,i_n:i_n+bin2dec(r_huff(k,1)-1)=0;%哈夫曼編碼矩陣r_huff中為二進(jìn)制數(shù),所以用到了bin3dec i_n=i_n+bin2dec(r_huff(k,1); %通過第一列分解重復(fù)的0 i_value=i_vli(r_huff(k,2),r_

32、huff(k,3); %通過第二三列,位數(shù)和編碼解出編碼真值 i_Rdcts_c_z(1,i_n)=i_value; i_n=i_n+1; end endendi_Rdcts_c=i_Rdcts_c_z(i_zig); %反zig_zag掃描i_Rdct_s(1,1:8)=i_Rdcts_c(1:8); %變?yōu)榫仃囆问絠_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(

33、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); %逆DCT變換i_R(i_r*8-7:i_r*8,i_c*8-7:i_c*8)=i_R_8_8; %將一個8*8子塊放回R色新矩陣中 endendi_RR=i_R+128; %范圍調(diào)回至0255%后邊同理依次為G、B編碼和解碼g_dc=0;g_n=0;g_AC=zeros;g_all_bit=

34、0;for i_r=1:1:37; for i_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_c_z(1);for i=2:1:64;if Gdcts_c_z(i)=0&&g_n<15&&i=64 g_n=g_n+

35、1;elseif Gdcts_c_z(i)=0&&g_n<15&&i=64 g_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;elseif Gdcts_c_z(i)=0&&r_n<15 g_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;elseif Gdcts_c_z(i)=0&&

36、;g_n=15 g_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;elseif Gdcts_c_z(i)=0&&g_n=15 g_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,3);g_code_bit=0;for j=0:1:g_ac_cnt;if j=0 siz,code=vl

37、i(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;else if g_AC(2*j)=0 g_huff(j+1,1)=cellstr(dec2bin(g_AC(2*j-1),4); g_huff(j+1,2)=cellstr(dec2bin(0); g_huff(j+1,3)=cellstr(dec2bin(0)

38、; else g_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;for k=1:1:g_ac_cnt+1; if k=1 i_value=i_vli(g_huff(1,2),g_h

39、uff(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); else if bin2dec(g_huff(k,1)=15&&bin2dec(g_huff(k,2)=0 i_Gdcts_c_z(1,i_n:i_n+15)=0; i_n=i_n+16; elseif bin2dec(g_huff(k,1)=0&&bin2dec(g_huff(k,2)=0 i_Gdcts_c_z(1,i_n)=0; i_n=i_n+1;

40、 else i_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; end endendi_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:24);i_Gd

41、ct_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=zeros;

42、b_all_bit=0;for i_r=1:1:37; for i_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);for i=2:1:64;if Bdcts_c_z(i)=0&&b_n<15&&i=6

43、4 b_n=b_n+1;elseif Bdcts_c_z(i)=0&&b_n<15&&i=64 b_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;elseif Bdcts_c_z(i)=0&&b_n<15 b_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;elseif Bdcts_c_z(i)=

44、0&&b_n=15 b_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;elseif Bdcts_c_z(i)=0&&b_n=15 b_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;for j=0:1:b_ac_cnt;if j=0 siz,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_huff(1,3)=cellstr(dec2bin(code,siz); b_code_bit=b_code_bit+siz;else if b_AC(2*j)=0 b_huff(j+1,1)=cel

溫馨提示

  • 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

提交評論