采用DCT進行圖像壓縮


一、實驗目的:熟悉變換編碼的圖像壓縮方法

二、實驗內容:以所給圖像為例,采用dct進行圖像壓縮編碼,通過改變模板矩陣中非零元素的個數,得到不同縮編碼圖像, 根據公式

 

,編寫程序計算原圖像和dct變換后得到的圖像之間的均方誤差。用到的matlab函數為im2double,dctmtx,blkproc

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

先上實驗要用到的圖片

下面的程序的模板矩陣是8*8的

 1 I=imread('C:/woman_blonde.tif');
 2 I=im2double(I);
 3 T=dctmtx(8);%得到一個8*8的離散余弦變化矩陣
 4 B=blkproc(I,[8 8],'P1*x*P2',T,T');% x就是每一個分成的8*8大小的塊,P1*x*P2相當於像素塊的處理函數,p1=T p2=T’,也就是fun=p1*x*p2'=T*x*T'的功能是進行離散余弦變換
 5 m=[1 1 1 0 0 0 0 0
 6    1 1 0 0 0 0 0 0
 7    1 0 0 0 0 0 0 0
 8    0 0 0 0 0 0 0 0
 9    0 0 0 0 0 0 0 0
10    0 0 0 0 0 0 0 0
11    0 0 0 0 0 0 0 0
12    0 0 0 0 0 0 0 0 ];
13 B2=blkproc(B,[8 8],'P1.*x',m);%舍棄每個塊中的高頻系數,達到圖像壓縮的目的
14 I2=blkproc(B2,[8 8],'P1*x*P2',T',T);%進行反余弦變換,得到壓縮后的圖象
15 cha=abs(I-I2);
16 junfang=mse(cha);
17 figure,imshow(I),title('原始圖像','Fontsize',18);
18 figure,imshow(I2),title('壓縮(解壓縮)圖像','Fontsize',18),
19 xlabel({'均方誤差: ';junfang},'Fontsize',18);

 下面的程序的模板矩陣是16*16的

 1 I3=imread('C:/woman_blonde.tif');
 2 I3=im2double(I3);
 3 T2=dctmtx(16);
 4 B3=blkproc(I3,[16 16],'P1*x*P2',T2,T2');
 5 m2=[1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
 6    1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
 7    1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 8    1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 9    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
10    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
11    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
12    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
13    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
14    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
15    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
16    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
17    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
18    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
19    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
20    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];
21 B4=blkproc(B3,[16 16],'P1.*x',m2);
22 I4=blkproc(B4,[16 16],'P1*x*P2',T2',T2);
23 cha1=abs(I3-I4);
24 junfang2=mse(cha1);
25 figure,imshow(I3),title('原始圖像','Fontsize',20);
26 figure,imshow(I4),title('壓縮(解壓縮)圖像','Fontsize',20),
27 xlabel({'均方誤差: ';junfang2},'Fontsize',20);

 對比運行結果:

8*8

16*16

對比還是容易發現,第二個代碼的運行結果圖片損失程度還是比較大的,因程序二模板的0個數占比更多,使更多的高頻像素被壓縮,而該壓縮是不可逆的,所以圖二損失程度更大。

下面是程序中幾個函數的說明

dctmtx

MATLAB圖像處理工具箱實現離散余弦變換有兩種方法:dct2和dctmtx(1)使用函數dct2,該函數用一個基於FFT的算法來提高當輸入較大的方陣時的計算速度。
(2)使用由dctmtx函數返回的DCT變換矩陣,這種方法較適合於較小的輸入方陣(例如8×8或16×16)。

①函數:dct2 
實現圖像的二維離散余弦變換。調用格式為: 
B = dct2(A) 
B = dct2(A,[M N]) 
B = dct2(A,M,N)
式中A表示要變換的圖像,M和N是可選參數,表示填充后的圖像矩陣大小,B表示變換后得到的圖像矩陣。

②函數:dctmtx 
D = dctmtx(N) 
式中D是返回N×N的DCT變換矩陣,如果矩陣A是N×N方陣,則A的DCT變換可用D×A×D’來計算。這在有時比dct2計算快,特別是對於A很大的情況。 

blkproc

功能:對圖像進行分塊處理
函數調用形式:B = blkproc(A,[m n],fun, parameter1, parameter2, ...)
B = blkproc(A,[m n],[mborder nborder],fun,...)
B = blkproc(A,'indexed',...)
參數解釋:[m n] :圖像以m*n為分塊單位,對圖像進行處理(如8像素*8像素)
          Fun:   應用此函數對分別對每個m*n分塊的像素進行處理
          parameter1, parameter2: 要傳給fun函數的參數
          mborder nborder:對每個m*n塊上下進行mborder個單位的擴充,左右進行nborder個單位的擴充,擴充的像素值為0,fun函數對整個擴充后的分塊進行處理。

mse

等價於sum(a.^2)/lenght(a);

MSE和RMSE都是網絡的性能函數。MSE是(神經)網絡的均方誤差,叫"Mean Square Error"。比如有n對輸入輸出數據,每對為[Pi,Ti],i=1,2,...,n.網絡通過訓練后有網絡輸出,記為Yi。那MSE=(求和(Ti-Yi)^2(i=1,2,..n))/n,即每一組數的誤差平方和再除以數據的對數。RMSE叫“Root Mean Square Error”,即在MSE基礎上要開根號,中文譯為“均方根誤差”,MSE=MSE開根號。亦即RMSE是MSE的平方根。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM