在空域對圖像進行濾波處理無非兩種情況,線性濾波和非線性濾波。濾波的意思就是對原圖像的每個像素周圍一定範圍內的像素進行運算,運算的範圍就稱爲掩膜或領域。而運算就分兩種了,如果運算只是對各像素灰度值進行簡單處理(如乘一個權值)最後求和,就稱爲線性濾波;而如果對像素灰度值的運算比較複雜,而不是最後求和的簡單運算,則是非線性濾波;如求一個像素周圍3x3範圍內最大值、最小值、中值、均值等操作都不是簡單的加權,都屬於非線性濾波。
2. 線性濾波Matlab進行線性濾波可以使用imfilter函數,使用非常的方便。
- g=imfilter (f, w, ltering_mode, boundary_options, size_options)
具體的使用方法就不細說了。掩膜的生成可以使用fspecial函數,可以參考其他
資料。
3. 非線性濾波matlab工具箱提供了兩個執行常規非線性濾波的函數:nlfilter和colfilt。nlfilter直接執行二維操作,而函數colfilt則以列的形式組織數據,雖然colfilt比nlfilter要佔用更多的內存,但執行速度要比nlfilter快許多,因此實際使用中如果注重速度,肯定都是選擇的colfilt。
但兩個函數的使用方法非常的不同,特別是colfilt還有點難理解的地方,通過對colfilt的使用終於搞明白了其使用方法,下面對colfilt使用中要注意的地方進行總結。
4. colfilt的運行過程及解釋colfilt的原型如下:g=colfilt (f, [m n], 'sliding', @fun, parameters).
- f:要進行濾波的原圖像
- [m,n]:掩膜(鄰域)的尺寸,一般爲奇數*奇數
- 'sliding':塊模式,sliding說明逐個像素的滑動mxn區域
- @fun:真是實現濾波的函數,它是一個函數指針,我們定義一個函數對mxn區域的像素進行處理,而這個函數會被colfilt自動調用。
- parameters:我們定義的函數要傳入的其他參數。
colfilt執行過程如下:
1. 首先對f進行列變換,假設f是MxN的圖像,則會生成一個mnxMN的矩陣。具體的變化方法要深刻體會,其實就是把原圖像每個像素鄰域內的mn個像素排成一列,原圖像總共有MN個像素,因此變換後的矩陣就有MN列。
2. 然後colfilt會每次選擇多列作爲一個矩陣傳入到fun中進行處理,到底選擇幾列是由colfilt按照一定策略進行的。而傳入矩陣的行數肯定是mn。
3. fun函數對傳入的矩陣進行運算,一般是一列一列的處理,然後返回一個行向量,這個行向量的每個元素對應每列處理的結果,因此傳入的矩陣有多少列就按序生成多少個結果放到對應的行向量中。
4. colfilt對返回的行向量進行存儲、反變換,最後得到和原圖像等大小的一個矩陣,這就是非線性濾波的最終結果。
5. 舉例(求圖像的SMD) function vars = vimSMD(f)
use colfilt f = padarray(f, [3, 3], 'replicate'); g = colfilt(f, [3,3], 'sliding', @vimabsolute); g = g(1+3:end-3,1+3:end-3); vars = sum(g(:))/numel(g(:));
function v = vimabsolute(A) [r c] = size(A);
v = zeros(1, c);
for i = 1:c b = reshape(A(:,i), 3, 3); v(i) = abs(b(2,2)-b(1,2)) + abs(b(2,2)-b(2, 1)); end |
當然求圖像的SMD不一定要用colfilt,是爲了演示它的用法才用這樣的方法,採用兩次線性濾波,然後相加的方法進行速度要快的多!