




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 . . . 課程設計任務書學生:王曉飛專業班級: 通信1001班指導教師:洪濤工作單位:信息工程學院題目:通信工程應用技術綜合訓練與實習初始條件:MATLAB軟件平臺設計任務與要求:圖像通信之前需要進行數據量壓縮,編程實現JPEG圖像壓縮標準的主要環節,完成壓縮和解壓過程,計算壓縮比。要求:將彩色圖像進行顏色空間轉換、對不同的顏色分量進行不同的采樣、對于3個分量進行8×8的DCT變換、對DCT系數矩陣按照JPEG推薦的量化表進行量化;對量化后的系數進行Z形掃描,最后進行熵編碼,形成碼流,計算比特數,和壓縮比。解壓從量化后的DCT系數表開始逆向進行。時間安排:序號設計容所用時間1根據
2、設計任務,分析電路原理,確定實驗方案2天2根據實驗條件進行電路的測試,并對結果進行分析7天3撰寫課程設計報告1天合計2周指導教師簽名:年月日系主任(或責任教師)簽名:年月日 目 錄摘要31概述51.1 圖像壓縮編碼技術51.2 離散余弦變換(DCT)51.3 MATLAB 與其圖像處理工具箱62 基于DCT的圖像壓縮編碼算法62.1 基于DCT的圖像壓縮編碼算法的過程62.2 基于DCT的JPEG圖像壓縮編碼步驟72.2.1 顏色空間的轉換和采樣72.2.2 二維離散余弦變換82.2.3 DCT系數的量化92.2.4 量化系數的編排102.2.5 DC系數的編碼112.2.6 AC系數的編碼1
3、12.2.7 組成位數據流123 基于DCT圖像壓縮的MATLAB實現134 matlab仿真結果.145 心得體會.15參考文獻17附錄.1826 / 26摘要隨著科學技術的發展,圖像壓縮技術越來越引起人們的關注,本論文研究了基于DCT變換的JPEG圖像壓縮編碼算法。首先說明了圖像壓縮在現代通信中的必要性和可行性以與MATLAB圖像處理工具箱的相關知識,然后重點介紹了JPEG壓縮編碼的具體過程和方法,詳細介紹了編碼中DCT變換、量化、熵編碼和霍夫曼編碼等模塊的原理。最后分析了圖像經過不同壓縮比時,圖像質量的變化情況。基于DCT 變換的JPEG 圖像壓縮方法簡單、方便,既能保證有較高的壓縮比,
4、又能保證有較好的圖像質量,是一種非常有用的圖像壓縮方法。關鍵詞:圖像壓縮技術 DCT變換 JPEG圖像 MATLAB圖像處理工具箱AbstractWith the development of science and technology, image compression technology has drawn increasing attention, this thesis DCT-based JPEG image compression algorithm. The outset that the image compression in the modern communicat
5、ions and the necessity and feasibility of MATLAB image processing toolbox of knowledge, and then focuses on the specific process of JPEG compression and methods described in detail in the DCT transform coding, quantization, entropy coding and the principle of Huffman coding and other modules. Finall
6、y after a different compression ratio of the image, the image quality changes. DCT-based JPEG image compression method is simple, convenient, and can guarantee a higher compression ratio, but also ensures better image quality, is a very useful image compression method.Keywords:imagecompression techn
7、ology, DCT transform , JPEG image , MATLAB Image Processing Toolbox 1概述1.1 圖像壓縮編碼技術3所謂的圖像壓縮編碼技術就是對要處理的圖像數據按一定的規則進行變換和組合, 從而達到以盡可能少的數據流(代碼)來表示盡可能多的數據信息。在眾多的圖像壓縮編碼標準中,JPEG(Joint Photographic Experts Group)格式是一種稱為聯合圖像專家組的圖像壓縮格式,它適用于不同類型、不同分辨率的彩色和黑白靜止圖像。1.2離散余弦變換(DCT)在JPEG圖像壓縮算法中,有一種是以離散余弦變換(DCT,Discret
8、e Cosine Transform)為基礎的有損壓縮算法。DCT變換利用傅立葉變換的性質,采用圖像邊界褶翻將圖像變換為偶函數形式,然后對圖像進行二維傅立葉變換,變換后僅包含余弦項,所以稱之為離散余弦變換。DCT編碼屬于正交變換編碼方式,用于去除圖像數據的空間冗余。變換編碼就是將圖像光強矩陣(時域信號)變換到系數空間(頻域信號)上進行處理的方法。在空間上具有強相關的信號,反映在頻域上是在某些特定的區域能量常常被集中在一起,或者是系數矩陣的分布具有某些規律。我們可以利用這些規律在頻域上減少量化比特數,達到壓縮的目的。圖像經DCT變換以后,DCT系數之間的相關性就會變小,而且大部分能量集中在少數的
9、系數上,因此,DCT變換在圖像壓縮中非常有用,是有損圖像壓縮國際標準JPEG的核心5。從原理上講可以對整幅圖像進行DCT變換,但由于圖像各部位上細節的豐富程度不同,這種整體處理的方式效果不好。為此,發送者首先將輸入圖像分解為8*8或16*16塊,然后再對每個圖像塊進行二維DCT變換,接著再對DCT系數進行量化、編碼和傳輸;接收者通過對量化的DCT系數進行解碼,并對每個圖像塊進行的二維DCT反變換,最后將操作完成后所有的塊拼接起來構成一幅單一的圖像。對于一般的圖像而言,大多數DCT系數值都接近于0,所以去掉這些系數不會對重建圖像的質量產生較大影響。因此,利用DCT進行圖像壓縮確實可以節約大量的存
10、儲空間。在實驗中,先將輸入的原始lena圖像分為8*8塊,然后再對每個塊進行二維DCT變換。MATLAB圖像處理上具箱中提供的二維DCT變換與DCT反變換函數如下:dct2實現圖像的二維離散余弦變換,其語法格式為:a、B=dct2(A) 返回圖像A的二維離散余弦變換值,其大小與A一樣且各元素為離散余弦變換的系數B(k1,k2)。b、B=dct2(A,m,n)或B=dct2(A,m,n) 如果m和n比圖像A大,在對圖像進行二維離散余弦變換之前,先將圖像A補零至m*n如果m和n比圖像A小。則進行變換之前,將圖像A剪切。idct2可以實現圖像的二維離散余弦反變換,其語法格式為:B=idct2(A);
11、B=idct2(A,m,n)或B=idct2(A,m,n) (1.2.2-1)1.3 MATLAB 與其圖像處理工具箱MATLAB語言是由美國MathWorks公司推出的計算機軟件,經過多年的逐步發展與不斷完善,現已成為國際公認的最優秀的科學計算與數學應用軟件之一,它集數值分析、矩陣運算、信號處理和圖形顯示于一體,構成了一個方便的、界面友好的用戶環境,而且還具有可擴展性特征。MATLAB中的數字圖像是以矩陣形式表示的,矩陣運算的語法對MATLAB中的數字圖像同樣適用,這意味著MATLAB強大的矩陣運算能力對用于圖像處理非常有利。圖像處理工具箱(Image Processing Toolbox)
12、提供了一套全方位的參照標準算法和圖形工具,用于進行圖像處理、分析、可視化和算法開發??蛇M行圖像壓縮、空間轉換、圖像增強、特征檢測、降噪、圖像分割和圖像配準等功能。工具箱部分函數均以開放式 MATLAB 語言編寫,這意味著可以檢查算法、修改源代碼和創建自定義函數。利用MATLAB圖像處理工具箱對基于DCT的JPEG圖像壓縮編碼理論算法進行仿真,軟件功能強大,應用簡單而效果良好。2 基于DCT的圖像壓縮編碼算法2.1 基于DCT的圖像壓縮編碼算法的過程基于DCT編碼的JPEG編碼壓縮過程框圖,如圖2.1-2所示。原始圖像數據分成8*8的小塊DCT變換量化器量化表熵編碼器碼表壓縮數據圖2.1-2 基
13、于DCT編碼的JPEG壓縮過程簡化圖上圖是基于DCT變換的圖像壓縮編碼的壓縮過程,解壓縮與上圖的過程相反。在編碼過程中,首先將輸入圖像顏色空間轉換后分解為8×8大小的數據塊,然后用正向二維DCT把每個塊轉變成64個DCT系數值,其中1個數值是直流(DC)系數,即8×8空域圖像子塊的平均值,其余的63個是交流(AC)系數,接下來對DCT系數進行量化,最后將變換得到的量化的DCT系數進行編碼和傳送,這樣就完成了圖像的壓縮過程。在解碼過程中,形成壓縮后的圖像格式,先對已編碼的量子化的DCT系數進行解碼,然后求逆量化并把DCT系數轉化為8×8樣本像塊(使用二維DCT反變換
14、),最后將操作完成后的塊組合成一個單一的圖像。這樣就完成了圖像的解壓過程。2.2 基于DCT的JPEG圖像壓縮編碼步驟2.2.1 顏色空間的轉換和采樣JPEG文件使用的顏色空間為1982年推薦的電視圖像數字化標準CCIR 601(現為ITU-RB T.601)。在這個色彩空間中,每個分量、每個像素的電平規定為255級,用8位代碼表示。JPEG只支持YCbCr顏色模式,其中Y代表亮度,CbCr代表色度。全彩色圖像RGB模式轉換到YCbCr模式,用下組公式 (2.2.1-3) 其逆變換為: (2.2.1-4)JPEG是以8×8的塊為單位來進行處理的,由于人眼對亮度Y的敏感度比色度CbCr
15、的敏感度大的多,所以采用縮減取樣的方式,通常采用YUV422取樣,圖2.2.1-5所示。圖2.2.1-5 YUV422取樣示意圖即對于16×16的塊,Y取4個8×8的塊,CbCr各取2個8×8的塊。也有YUV411方式,Y取4個8×8的塊,CbCr各取1個8×8的塊。YUV422取樣方式,數據減少1/3。YUV411取樣方式,數據減少1/2。2.2.2 二維離散余弦變換在傅里葉級數展開式中,如果被展開的函數是實偶函數,那么,其傅里葉級數中只包含余弦項,在將其離散化由此可導出余弦變換,或稱之為離散余弦變換(DCT,Discrete Cosine
16、Transform)。二維離散余弦正變換公式為:(2.2.2-6)式中,。二維離散余弦逆變換公式為(2.2.2-7)式中,。JPEG采用的是8×8大小的子塊的二維離散余弦變換。在編碼器的輸入端,把原始圖像順序地分割成一系列8×8的子塊,子塊的數值在-128到127之間。采用余弦變換獲得64個變換系數。變換公式,如式(2-5)所示。(2.2.2-8)式中,。在MATLAB的圖像處理工具箱中,可以直接調用dct2和idct2來實現二維離散余弦變換與其反變換。a、dct2函數實現圖像的二維離散余弦變換,其語法為:F=dct2(f)b、idct2函數實現圖像的二維離散余弦逆變換,其
17、語法為:F=idct2(f)在MATLAB圖像處理工具箱中,有一個對圖像進行塊操作的函數blkproc,利用這個函數,可以直接實現圖像一系列8×8子塊的DCT變換。其語法格式為:B = blkproc(A,m n,fun, parameter1,,parameter2, .)B = blkproc(A,m n,mborder nborder,fun,.)B = blkproc(A,'indexed',.)8×8的圖像經過DCT變換后,其低頻分量都集中在左上角,高頻分量分布在右下角(DCT變換實際上是空間域的低通濾波器)。由于該低頻分量包含了圖像的主要信息(如
18、亮度),而高頻與之相比,就不那么重要了,所以我們可以忽略高頻分量,從而達到壓縮的目的。將高頻分量去掉,這就要用到量化,它是產生信息損失的根源,這里的量化操作,就是將某一個值除以量化表中對應的值。由于量化表左上角的值較小,右上角的值較大,這樣就起到了保持低頻分量,抑制高頻分量的目的2.2.3 DCT系數的量化量化是對經過DCT變換后的頻率系數進行量化,其目的是減小非“0”系數的幅度以與增加“0”值系數的數目,它是圖像質量下降的最主要原因。對于基于DCT的JPEG圖像壓縮編碼算法使用如圖2.2.3-9所示的均勻量化器進行量化,因此使用了表2.2.3-10所示的一種量化表。此外,由于人眼對低頻分量的
19、圖像比對高頻分量的圖像更敏感,因此表中的左上角的量化步距要比右下角的量化步距小。DCT系數輸入量化系數輸出圖2.2.3-9均勻量化器亮度和色度因為代表的圖像的信息量不同,亮度代表了圖像的低頻分量,色度代表了圖像的高頻分量,要分別對亮度和色度進行量化,所以量化表也是不同的。JPEG壓縮色度和亮度量化表如表2.2.3-10所示。表2.2.3-10 JPEG壓縮色度和亮度量化表亮度量化表色度量化表1611101624405161171824479999999912121419265860551821266699999999141316244057695624265699999999991417222
20、95187806247669999999999991822375668109103779999999999999999243555648110411392999999999999999949647887103121120101999999999999999979929598112100103999999999999999999量化會產生誤差,上圖是綜合大量的圖像測試的實的就是將高頻部分變成接近于0,以便以后處理。JPEG可以在壓縮比和圖像質量間作取舍,方法就是改變量化值。如果量化值放大一倍,則有更多的系數量化為0,提高了壓縮比。2.2.4 量化系數的編排經過DCT變換后,低頻分量集中在左上角,
21、其中F(0,0)(即第一行第一列元素)代表了直流(DC)系數,即8×8子塊的平均值,要對它單獨編碼。由于兩個相鄰的8×8子塊的DC系數相差很小,所以對它們采用差分編碼DPCM,可以提高壓縮比,也就是說對相鄰的子塊DC系數的差值進行編碼。8×8的其它63個元素是交流(AC)系數6,采用行程編碼。所以量化后的系數要重新編排,目的是為了增加連續的“0”系數的個數,就是“0”的游程長度,方法是按照Z字形的式樣編排。DCT變換后低頻分量多呈圓形輻射狀向高頻率衰減,因驗結果,對于大部分圖像都有很好的結果。表中可以看出,高頻部分對應的量化值大,目此可以看成按Z字形衰減。因此,量
22、化系數按Z字形掃描讀數,這樣就把一個8×8的矩陣變成一個1×64的矢量,頻率較低的系數放在矢量的頂部。量化后的DCT系數的編排如圖2.2.4-11所示。圖2.2.4-11 量化DCT系數的編排量化后的DCT系數的序號如表2.2.4-12所示。0156141527282471316262942381217253041439111824314044531019233239455254202233384651556021343747505659613536484957586263表2.2.4-12 量化DCT系數的序號2.2.5 DC系數的編碼8×8子塊的64個變換系數
23、經量化后,按直流系數DC和交流系數AC分成兩類處理。坐標u=v=0的直流系數DC實質上就是空域圖像中64個像素的平均值。圖像塊經過DCT變換之后得到的DC直流系數有兩個特點,一是系數的數值比較大,二是相鄰8×8圖像塊的DC系數值變化不大。根據這個特點,JPEG算法使用了差分脈沖調制編碼技術。差分脈沖編碼調制(DPCM,Differential Pulse Code Modulation),是一種對模擬信號的編碼模式,先根據前一個抽樣值計算出一個預測值,再取當前抽樣值和預測值之差作為編碼用。此差值稱為預測誤差。抽樣值和預測值非常接近(因為相關性強),預測誤差的可能取值圍比抽樣值變化圍小
24、。所以可用少幾位編碼比特來對預測誤差編碼,從而降低其比特率。這是利用減小冗余度的辦法,降低了編碼比特率。因此,對DC系數編碼進行差分脈沖編碼就是對相鄰圖像塊之間量化DC系數的差值(Delta)進行編碼,即對相鄰塊之間的DC系數的差值DIFF=DC-DC編碼。DC采用差值脈沖編碼的主要原因是由于在連續色調的圖像中,其差值多半比原值小,對差值進行編碼所需的位數,會比對原值進行編碼所需的位數少許多。例如差值為5,它的二進制表示值為101,如果差值為-5,則先改為正整數5,再將其二進制轉換成1的補數即可。所謂1的補數,就是將每個Bit若值為0,便改成1;Bit為1,則變成0。差值5應保留的位數為3,列
25、出差值所應保留的Bit數與差值容的對照。 在差值前端另外加入一些差值的霍夫曼碼值,例如亮度差值為5(101)的位數為3,則霍夫曼碼值應該是100,兩者連接在一起即為100101。2.2.6 AC系數的編碼DCT變換所得系數除直流系數之外的其余63個系數稱為交流系數(AC系數)。量化AC系數的特點是1× 64矢量中包含有許多“0”系數,并且許多“0”是連續的,因此使用非常簡單和直觀的行程長度編碼(RLE)對它們進行編碼。所謂行程編碼(Run-Length Encoding)就是指僅存儲一個像素值以與具有一樣顏色的像素數目的圖像數據編碼方式,或稱游程編碼,常用RLE(Run-Length
26、 Encoding)表示。該壓縮編碼技術相當直觀和經濟,運算也相當簡單,因此解壓縮速度很快。RLE壓縮編碼尤其適用于計算機生成的圖形圖像,對減少存儲容量很有效果。7654321076543210第一字節第二字節兩個非零值之間的連續零的個數下一個非零值所占的比特數下一個非零系數的實際值圖2.2.6-13 AC編碼格式63個AC系數采用行程編碼的方式進行編碼的格式如圖2.2.6-13所示。也即在AC01到AC63中,找出每一個非零的AC值,將其表示成(NN/SS)VV的形式,其中:NN表示該AC值前的0的個數。而SS、VV與DC的定義一樣。如果連續的非0超過15個時,增加一個擴展字節:(15/0)
27、表示連續16個0。另外若有一串0延伸到AC63,一律用(0/0)表示結束。對于AC系數,有兩個符號。符號1為行程和尺寸,(0,0)和(15,0)是兩個比較特殊的情況。(0,0)表示塊結束標志EOB,(15,0)表示ZRL,當行程長度超過15時,用增加ZRL的個數來解決,所以最多有三個ZRL(3×16+15=63)。符號2為幅度值(Amplitude)。對于DC系數,也有兩個符號。符號1為尺寸(Size),符號2為幅度值(Amplitude)。對于AC系數,符號1和符號2分別進行編碼。零行程長度超過15個時,有一個符號(15,0),塊結束時只有一個符號(0,0)。對符號1進行Huffm
28、an編碼(亮度,色差的Huffman碼表不同),對符號2進行變長整數(VLI)編碼。舉例來說:Size=6時,Amplitude的圍是-63-32,以與3263,對絕對值一樣,符號相反的碼字之間為反碼關系。所以AC系數為32的碼字為100000,33的碼字為100001,-32的碼字為011111,-33的碼字為011110。符號2的碼字緊接于符號1的碼字之后。對于DC系數,Y和UV的Huffman碼表也不同。3 基于DCT圖像壓縮的MATLAB實現基于DCT的圖像壓縮編碼的MATLAB實現的流程圖:從上至下的步驟為:開始;輸入圖片;分成8*8的像素塊,進行DCT變換;輸入量化表,對變換系數量
29、化;對量化系數進行掃描;選擇一幅圖對其進行不同的壓縮比變換;反量化;反DCT變換;顯示所選圖像的信噪比;結束。如程序流程圖3.2-18。圖3.2-18 程序流程圖4 MATLAB仿真結果 原始圖像 亮度量化矩陣倍乘1,色度倍乘1 亮度量化矩陣倍乘1,色度倍乘10 亮度量化矩陣倍乘1,色度倍乘20亮度度量化矩陣倍乘10,色度倍乘1 亮度度量化矩陣倍乘20,色度倍乘15 心得體會經過這兩周的課程設計,讓我收獲多多。剛開始接到課程設計任務時,還很興奮,因為這次的課設只用軟件仿真就可以了,而不用做實物,這樣可以大節約時間。但事實證明我的想法是錯誤的。雖然之前有接觸MATLAB這個軟件,但是也只是會調用
30、一些簡單的函數來做計算,或用一些簡單的畫圖命令來作圖,一直覺得這個仿真軟件的功能很強大,但沒有怎么深入地去運用。這次的課設讓我知道,我之前對它的了解簡直只是冰山一角。而要用它來實現自己的專業目的,更是增加了難度。將在課堂上學到的理論知識用它來仿真實現,這就要求我們對理論知識有全面深入透徹的理解,并且很熟悉仿真軟件,但我在這兩個方面都有欠缺,所以實際操作起來也沒有剛開始想象的那樣容易??傊n程設計讓我收獲頗豐,同時也讓我發現了自身的不足。在實驗課上學得的,我將發揮到其它中去,也將在今后的學習和工作中不斷提高、完善;在此間發現的不足,我將努力改善,通過學習、實踐等方式不斷提高,克服那些不應成為學
31、習、獲得知識的障礙。在今后的學習、工作中有更大的收獲,在不斷地探索中、在無私的學習、奉獻中實現自己的人身價值!參考文獻:1 慶棟:圖像編碼基礎,清華大學,2006.6, P31-P422 余明:圖像編碼標準H.246技術,人民郵電,2006.2, P7-P103 春田、育挺:圖像壓縮編碼,清華大學,2006.4,P3-P74 鐘玉琢:基于對象的多媒體數據壓縮編碼國際標準MPEG-4與其校驗模型,科學,2000.6, P21-P305 蘭蓀、卓 力:小波編碼與網絡視頻傳輸,科學,2008.8 , P52-P576 王相海、宋傳鳴:圖像與視頻可分級編碼,科學,2009.7, P15-P27 7 導
32、向科技:MATLAB6.0程序設計與實例應用,中國鐵道. 2001.5, P135-P1418 蒲 ?。篗ATLAB6.0數學手冊,浦東電子,2002,P21P289 于萬波:基于MATLAB的計算機圖形與動畫技術,清華大學,2007,P51P107 附錄 源程序:%jpeg.mfunction copy,gao,kuan,bpp,comp,psnr=jpeg()global mm nn col row im1 u1 u2 ticinitEncode;rgb=imread(lena.tif);ycbcr=rgb2ycbcr(rgb); y=ycbcr(:,:,1);cb=ycbcr(:,:,2
33、);cr=ycbcr(:,:,3);mm,nn=size(y);row=ceil(mm/8)*8;col=ceil(nn/8)*8;y=double(y)-128;cb=double(cb)-128;cr=double(cr)-128;codeoutY=Code(y);len1=length(codeoutY);for i=1:len1 ss1(i)=char(codeoutY(i)+48);endFid1=fopen('YCode.txt','w');% 將y分量的壓縮碼保存到文本文件中fprintf(Fid1,'%s',ss1);fclose
34、(Fid1);codeoutCb=Code2(cb);len2=length(codeoutCb);for i=1:len2 ss2(i)=char(codeoutCb(i)+48);endFid2=fopen('CbCode.txt','w');% 將cb分量的壓縮碼保存到文本文件中fprintf(Fid2,'%s',ss2);fclose(Fid2);codeoutCr=Code2(cr);len3=length(codeoutCr);for i=1:len3 ss3(i)=char(codeoutCr(i)+48);endFid3=fope
35、n('CrCode.txt','w');% 將cr分量的壓縮碼保存到文本文件中fprintf(Fid3,'%s',ss3);fclose(Fid3);Fid1=fopen('YCode.txt','r');a=fscanf(Fid1,'%s'); len1=length(a); for i=1:len1 codeinY(i)=logical(double(a(i)-48); end fclose(Fid1);decodeoutY=UnCode(codeinY);disp('編碼比特率:
36、9;);bpp=(length(codeoutY)+length(codeoutCb)+length(codeoutCr)/(mm*nn),disp('壓縮比為:');comp=(24*mm*nn)/(length(codeoutY)+length(codeoutCb)+length(codeoutCr),disp('PSNR為:');mseY=mean(mean(double(zzz(:,:,1)-double(rgb(:,:,1).2);psnrY=10*log10(2552/mseY);mseCb=mean(mean(double(zzz(:,:,2)-d
37、ouble(rgb(:,:,2).2);psnrCb=10*log10(2552/mseCb);mseCr=mean(mean(double(zzz(:,:,3)-double(rgb(:,:,3).2);psnrCr=10*log10(2552/mseCr);psnr=(psnrY+psnrCb+psnrCr)/3;%code.mfunction yCodeOut=Code(y)global row colfun1=QuantyY;% 亮度量化函數fun3=dct2;tic%先進行DCT變換ydct=blkproc(y,8,8,fun3);disp('DCT');toc%量化
38、ticquanity_y=round(blkproc(ydct,8,8,fun1); %取整,四舍五入disp('量化');toc%Z形掃描ticzscan_y=zeros(1,row*col);zscan=Zscan;%Zscan為Z形掃描函數zscan_y=blkproc(quanity_y,8 8,zscan);zscan_y=zscan_y'disp('形掃描');toctic%編碼yCodeOut=YCode(zscan_y(1:64),0); %對第一塊編碼for i=2:(row*col/64) m=YCode(zscan_y(64*i-6
39、3):64*i),zscan_y(64*(i-1)-63); yCodeOut=yCodeOut m;enddisp('編碼');toc%code2.mfunction yCodeOut=Code2(y)global row colfun1=QuantyC;% 量化函數fun3=dct2;tic%先進行DCT變換ydct=blkproc(y,8,8,fun3);disp('DCT');toc%量化ticquanity_y=round(blkproc(ydct,8,8,fun1); %取整,四舍五入disp('量化');toc%Z形掃描ticzsc
40、an_y=zeros(1,row*col);zscan=Zscan;%Zscan為Z形掃描函數zscan_y=blkproc(quanity_y,8 8,zscan);zscan_y=zscan_y'disp('形掃描');toctic%編碼yCodeOut=YCode2(zscan_y(1:64),0);for i=2:(row*col/64) m=YCode2(zscan_y(64*i-63):64*i),zscan_y(64*(i-1)-63); yCodeOut=yCodeOut m;enddisp('編碼');toc%QuantyC.mfunc
41、tion out=QuantyC(x)global u2%色度量化函數qy=17,18,24,47,99,99,99,99; 18,21,26,66,99,99,99,99; 24,26,56,99,99,99,99,99; 47,66,99,99,99,99,99,99; 99,99,99,99,99,99,99,99; 99,99,99,99,99,99,99,99; 99,99,99,99,99,99,99,99; 99,99,99,99,99,99,99,99;out=x./(u2*qy);%QuantyY.mfunction out=QuantyY(x)global u1%亮度量化函
42、數qy=16,11,10,16,24,40,51,61; 12,12,14,19,26,58,60,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;out=x./(u1*qy);%Zscan.mfunction codeOut=YCode(zscanOut,prevDc)%輸入z形掃描結果,1*64矩陣,輸出一維長度不
43、定碼流%定義hufman直流碼表yDcTable(1,12)=struct('code','data',);yDcTable(1).data=0;yDcTable(1).code=0 0;yDcTable(2).data=1;yDcTable(2).code=0 1 0;yDcTable(3).data=2;yDcTable(3).code=0 1 1;yDcTable(4).data=3;yDcTable(4).code=1 0 0;yDcTable(5).data=4;yDcTable(5).code=1 0 1;yDcTable(6).data=5;yDc
44、Table(6).code=1 1 0;yDcTable(7).data=6;yDcTable(7).code=1 1 1 0;yDcTable(8).data=7;yDcTable(8).code=1 1 1 1 0;yDcTable(9).data=8;yDcTable(9).code=1 1 1 1 1 0;yDcTable(10).data=9;yDcTable(10).code=1 1 1 1 1 1 0;yDcTable(11).data=10;yDcTable(11).code=1 1 1 1 1 1 1 0;yDcTable(12).data=11;yDcTable(12).c
45、ode=1 1 1 1 1 1 1 1 0;%直流編碼diff=zscanOut(1)-prevDc; %得到與前一塊直流系數之差if(diff=0) %差值為0的情況 dcCodeOut=0 0;else rangeCode=dec2bin(abs(diff); %得到差值的絕對值的二進制編碼二進制補碼 rangeCode=double(rangeCode)-48; %得到double數組 if(diff<0) rangeCode=rangeCode; end sizeCode=yDcTable(length(rangeCode)+1).code; %sieCode存儲差值的二進制的位
46、數 dcCodeOut=sizeCode rangeCode; end %交流編碼 acCodeOut=AcCode(zscanOut); codeOut=dcCodeOut acCodeOut;diff=zscanOut(1)-prevDc;if(diff=0) dcCodeOut=0 0 ;else rangeCode=dec2bin(abs(diff); rangeCode=double(rangeCode)-48; if(diff<0) rangeCode=rangeCode; end sizeCode=yDcTable(length(rangeCode)+1).code; dc
47、CodeOut=sizeCode rangeCode;end %交流編碼 acCodeOut=AcCode2(zscanOut); codeOut=dcCodeOut acCodeOut;binacRange=cell(1,1);%幅度值二進制編碼forHuf=cell(1,1);%Hufman編碼的輸入參數,每個元素包括兩個部分:游程長度和binacRange長度hufCodeOut=cell(1,1);out=cell(1,1);for i=1:j binacRangei=dec2bin(abs(bi(2); binacRangei=binacRangei-48; if(bi(2)<
48、0) binacRangei=binacRangei; end acBits(i)=length(binacRangei);%binacRange長度幅值的二進制長度 if(bi(2)=0) acBits(i)=0; %針對EOB數據塊和15 0 end forHufi=bi(1) acBits(i);%forHuf為"行程/尺寸"endfor i=1:j hufCodeOuti=YAcHufCode(forHufi);%"行程/尺寸的哈夫曼碼 outi=hufCodeOuti binacRangei;%碼包括兩部分,即行程/尺寸的哈夫曼碼和幅度值編碼 if(bi
49、(2)=0)outi=hufCodeOuti; %幅度為0,則其編碼長度為0 endendacCodeOut=out1;for i=2:j acCodeOut=acCodeOut outi;end%AcCode2.mfunction acCodeOut=AcCode2(zScanOut)%交流系數編碼,此處省略前面部分代碼,對應部分與AcCode.m一致N=8;num=N*N+1;i=N*N;b=cell(1,N*N);for i=1:j hufCodeOuti=YAcHufCode(forHufi);%"行程/尺寸的哈夫曼碼 outi=hufCodeOuti binacRangei
50、;%碼包括兩部分,即行程/尺寸的哈夫曼碼和幅度值編碼 if(bi(2)=0)outi=hufCodeOuti; %幅度為0,則其編碼長度為0 endendacCodeOut=out1;for i=2:j acCodeOut=acCodeOut outi;end%UnCode.mfunction rey=UnCode(CodeOut)global row col%輸入碼流,輸出灰度矩陣varable;%定義變量,主要為霍夫曼編碼表yAcTree=MakeTree(yAcTable);%調用函數從碼表生成二叉樹以便于解碼yDcTree=MakeTree(yDcTable);%以下是解碼部分%Uncode應當與z形掃描后得到的數組完全一致%i是碼流數組的指針%j是解碼出來一維數組的指針%blockcount指明現在正在為第幾個塊解碼i=1;j=1;blockcount=0;ticwhile(i<length(CodeOut) blockcount=blockcount+1;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 軟件設計師專業知識更新試題及答案
- 軟考網絡工程師議題試題及答案探討
- 軟件設計師考試自我反思的重要性與試題與答案
- 項目管理師考試實戰試題及答案分享
- 軟件設計師考試2025年的關鍵技術試題及答案
- 網絡工程師考試經典試題及答案回顧
- 機電工程專利撰寫技巧試題及答案
- 西方政治制度實證研究的試題及答案
- 網絡工程師考試應對策略試題及答案
- 網絡設備監控與報警系統試題及答案
- 日北京SOLANA藍色港灣項目定位與運營推廣方案
- 活動策劃崗位筆試題目大全答案
- 常見異常心電圖正確識別理論考核試題題庫及答案
- 六旋翼無人機的設計(畢業設計)
- 《低段培智學生行為習慣養成教育的研究》小課題研究中期報告
- TC4鈦合金拉拔工藝探索
- 八年級數學上冊《平方差公式》的教學反思(優秀3篇)
- “鄉村振興”戰略應知應會試題及答案(分享)
- 衢州萬達暖通工程施工方案(最終版)
- 學校端午假期致學生家長一封信
- 遺傳自制習題答案個我
評論
0/150
提交評論