8.離散餘弦變換

更多MATLAB圖像處理視頻請點擊  http://study.163.com/course/courseMain.htm?courseId=1003594013

在 MATLAB 圖像處理工具箱中,dct2 函數用於計算圖像的二維離散餘弦變換(DiscreteCosine Transform)簡稱 DCT。大多數情況下,DCT 用於壓縮圖像,JPEG 圖像格式就採用了DCT 算法。

更多MATLAB圖像處理視頻請點擊  http://study.163.com/course/courseMain.htm?courseId=1003594013

1.離散餘弦變換的基本概念

假設矩陣 A 的大小爲 M×N,其二維離散餘弦變換的定義爲,

其中 B pq 稱爲矩陣 A 的 DCT 係數。在 MATLAB 中,矩陣的下標從 1 開始而不是從 0 開始,所以 A(1,1)和 B(1,1)分別代表上面的 A 00 和 B 00 。


DCT 是一種可逆變換,它的逆變換定義爲:



MATLAB 圖像處理工具箱提供的 DCT 函數有 3 個,分別是 dct2、dctmtx 和 idct2。

(1)dct2

dct2 函數採用基於 FFT 的算法,主要用於實現較大輸入矩陣的離散餘弦變換。其語法格式爲:
B = dct2(A)
B = dct2(A,m,n)
B = dct2(A,[m n])

B=dct2(A)返回圖像 A 的二維離散餘弦變換值,它的大小與 A 相同,且各元素爲離散餘弦變換的係數 B(kl,k2)。
B = dct2(A,m,n)或 B = dct2(A,[m n])表示在對圖像 A 進行二維離散餘弦變換之前,先將圖像 A 補零至 m×n。如果 m 和 n 比圖像 A 小,則進行變換之前,將圖像 A 進行剪切。


(2)dctmtx

  dctmtx 函數主要用於實現較小輸入矩陣的離散餘弦變換。其語法格式爲:
  D = dctmtx(M)
  D = dctmtx(M)返回 M×M 大小的 DCT 矩陣。其形式爲


(3)idct2

       idct2函數可以實現圖像的二維逆離散餘弦變換,其語法格式爲:

        B = idct2(A)
        B = idct2(A,m,n)
        B = idct2(A,[m n])
        B = idct2(A)計算矩陣 A 的二維逆離散餘弦變換,返回圖像 B 的大小與 A 相同。
        B=idct2(A,m,n)或 H=idct2(A, [m n])表示在對矩陣 A 進行二維逆離散餘弦變換之前,先將矩陣 A 補零至 m×n。如果 m 和 n 比矩陣 A 小,則進行變換之前,先對矩陣 A 進行   剪切操作,返回圖像大小爲 m×n。

例:

面的例子將如圖 4-13 所示的一幅圖像進行離散餘弦變換,可以注意到圖像能量的絕大
部分位於變換矩陣的左上角,結果如圖 所示。然後,將 DCT 變換值小於 10 的係數設爲0,然後利用 idct2 函數重構圖像,其結果如圖所示。

RGB = imread('autumn.tif');
I = rgb2gray(RGB);
J = dct2(I);
imshow(log(abs(J)),[]), colormap(jet(64)), colorbar,title('執行DCT的結果');
J(abs(J) < 10) = 0;
K = idct2(J);
figure,imshow(I),title('原圖');
figure,imshow(K,[0 255]),title('對壓縮圖像重構後的結果');




2、離散餘弦變換函數的應用

        在 JPEG 圖像壓縮算法中,圖像常被分成 8×8 或 16×16 的圖像塊,然後對每個圖像塊進行離散餘弦變換,對變換結果進行量化、編碼及傳輸。在接收端,量化的 DCT 係數被解碼,並用來計算每個圖像塊的逆離散餘弦變換,最後把各圖像塊拼接起來構成一幅圖像。對一幅典型的圖像而言,許多 DCT 的係數近似爲 0,把它們去掉並不會明顯影響重構圖像的質量。

      正如前面介紹的,實現 DCT 的方法有兩種,而利用函數 dctmtx 的方法可以比較快速地解決 JPEG 圖像壓縮問題。下面舉一個圖像壓縮的例子。

    在該例中,將輸入圖像劃分成 8×8 的圖像塊,計算它們的 DCT 係數,並只保留 64 個係數中的 10 個,然後利用這 10 個係數對每個圖像塊實現逆 DCT 來重構圖像,

 I = imread('cameraman.tif');
I = im2double(I);%圖像數據類型轉換爲double類型
T = dctmtx(8); %產生 DCT 變換矩陣
B = blkproc(I,[8 8],'P1*x*P2',T,T');  %計算二維 DCT
%P1*x*P2相當於像素塊的處理函數
%,p1=T p2=T’,進行離散餘弦變換 其中T爲dctmtx(n)函數得到的DCT變換矩陣
mask = [1 1 1 1 0 0 0 0
1 1 1 0 0 0 0 0
1 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0];
%二值掩模,用來壓縮 DCT 的係數
B2 = blkproc(B,[8 8],'P1.*x',mask);
%只保留 DCT 的 10 個係數
I2 = blkproc(B2,[8 8],'P1*x*P2',T',T);
%逆 DCT,用來重構圖像
imshow(I),title('原圖');
figure,imshow(I2),title('壓縮後重構圖像');

更多MATLAB圖像處理視頻請點擊  http://study.163.com/course/courseMain.htm?courseId=1003594013

發佈了91 篇原創文章 · 獲贊 320 · 訪問量 53萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章