一、實驗目的:熟悉變換編碼的圖像壓縮方法
二、實驗內容:以所給圖像為例,采用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的平方根。