1. 程式人生 > >matlab影象處理工具

matlab影象處理工具

影象的變換技術
為了快速有效地對影象進行處理和分析,常常需要將原定義在影象空間的影象以某種形 式轉換到另外一些空間,並利用這些空間特有的性質方便地進行一定的加工,最後再轉換回 影象空間以得到需要的效果。這種使影象處理簡化的方法通常是對影象進行變換。影象變換 技術在影象增強、影象恢復和有效地減少影象資料、進行資料壓縮以及特徵提取等方面都有 著十分重要的作用。本節將主要對應用最多傅立葉變換、離散餘弦變換、小波變化以及 MATLAB 7.0 實現進行比較詳細的介紹。
 數字影象的二維傅立葉變換
在影象處理的廣泛領域中,傅立葉變換起著非常重要的作用,包括影象的效果增強、圖 像分析、影象復原和影象壓縮等。在影象資料的數字處理中常用的是二維離散傅立葉變化, 它能把空間域的影象轉變到頻域上進行研究,從而能很容易地對影象的各空間頻域成分進行 相應處理。在第 10 章已經比較詳細地介紹了傅立葉變換以及離散傅立葉變換的概念,而二維 傅立葉變換又是一維傅立葉變換的簡單的推廣,這裡不再贅述,著重介紹二維傅立葉變換在 影象處理中的應用
1.MATLAB 7.0 提供的快速傅立葉變換函式
在 MATLAB 7.0 中,提供了 fft 函式、fft2 函式和 fftn 函式分別用於進行一維 DFT、二維 DFT 和 N 維 DFT 的快速傅立葉變換;ifft 函式、ifft2 函式和 ifftn 函式分別用於進行一維 DFT、 二維 DFT 和 N 維 DFT 的快速傅立葉反變換。下面分別進行具體介紹
(1)fft2 函式 該函式是用於計算二維快速傅立葉變化,其語法格式為:
(2)fftn 函式 該函式用於 n 維傅立葉變換,其語法格式為:
(3)fftshift 函式 該函式是用於將變換後圖像頻譜中心從矩陣的原點移到矩陣的中心,其語法格式為:
(4)ifft2 函式 該函式用於計算影象的二維傅立葉反變換,其語法格式為:
(5)ifftn 函式 該函式用於計算 n 維傅立葉反變換,其語法格式為:
2.二維傅立葉變換的 MATLAB 7.0 實現
下面,舉例來說明傅立葉變換的實現語句 B = fft2(A),該語句執行對矩陣 A 有二維傅立 葉變換。給出一幅影象(saturn2.tif),其傅立葉變換程式如下
figure(1);
load imdemos saturn2; %顯示影象
imshow(saturn2);
figure(2); %進行傅立葉變換
B = fftshift(fft2(saturn2)); %顯示變換後的係數分佈
imshow(log(abs(B)),[]),colormap(jet(64)),colorbar
3. 濾波器頻率響應
利用傅立葉變換可以得到線性濾波器的頻率響應,其過程如下:首先求出濾波器的脈衝 響應,然後利用快速傅立葉變換演算法對濾波器的脈衝響應進行變換,得到的結果就是線性濾 波器的頻率響應。MATLAB 7.0 工具箱中提供的 freqz2 函式就是利用這個原理可以同時計算 和顯示濾波器的頻率響應。 下面是一個利用 freq2 函式得到的高斯濾波器的頻率響應的程式:
h = fspecial(’gaussian’);
freqz2(h)
4. 快速卷積
傅立葉變換的另一個重要特性就是能夠實現快速卷積。由線性系統理論可知,兩個函式 卷積的傅立葉變換等於兩個函式的傅立葉變換的乘積。該特性與快速傅立葉變換相結合,可 以快速計算函式的卷積。假設 A 是一個 M×N 的矩陣,B 是一個 P×Q 的矩陣,則快速計算 矩陣的方法如下:
下面是一個計算魔方陣和一個 1 矩陣的卷積的程式:
A = magic(3);
B = ones(3); %對 A 進行零填充,使之成為 8×8 矩陣
A(8,8) = 0; %對 B 進行零填充,使之成為 8×8 矩陣
B(8,8) = 0;
C = ifft2(fft2(A).*fft2(B)); %抽取矩陣中的非零部分
C = C(1:5,1:5); %去掉錯誤的,由四捨五入產生的虛部
C = real(C)
5.影象特徵識別
傅立葉變換還能夠用來分析兩幅影象的相關性,相關性可以用來確定一幅影象的特徵, 在這個意義下,相關性通常被成為模板匹配。例如,假如希望在影象 text.tif 中定位字元“a”, 如圖 11-13 左上所示,可以採用下面的方法定位。 將包含字母“a”的影象與 text.tif 影象進行相關運算,也就是首先將字母 a 和影象 text.tif 進行傅立葉變換,然後利用快速卷積的方法,計算字母 a 和影象 text.tif 的卷積(其結果如圖 11-13右上所示),提取卷積運算的峰值,如圖11-13左下所示的白色亮點,即得到在影象text.tif 中對字母“a”定位的結果。 程式程式碼如下: %讀入影象’text.tif’
bw = imread(’text.png’); %從影象中抽取字母 a 的影象
a = bw(32:45,88:98); 
subplot(2,2,1),
imshow(bw);
subplot(2,2,2),
imshow(a);
C = real(ifft2(fft2(bw) .* fft2(rot90(a,2),256,256)));
subplot(2,2,3)
imshow(C,[]) %選擇一個略小於 C 中最大值的值做為閾值
thresh = 60; % 
subplot(2,2,4), %顯示畫素值超過閾值的點
imshow(C > thresh)%