在空域對圖像進行濾波處理無非兩種狀況,線性濾波和非線性濾波。濾波的意思就是對原圖像的每一個像素周圍必定範圍內的像素進行運算,運算的範圍就稱爲掩膜或領域。而運算就分兩種了,若是運算只是對各像素灰度值進行簡單處理(如乘一個權值)最後求和,就稱爲線性濾波;而若是對像素灰度值的運算比較複雜,而不是最後求和的簡單運算,則是非線性濾波;如求一個像素周圍3x3範圍內最大值、最小值、中值、均值等操做都不是簡單的加權,都屬於非線性濾波。vim
2. 線性濾波Matlab進行線性濾波可使用imfilter函數,使用很是的方便。ide
具體的使用方法就不細說了。掩膜的生成可使用fspecial函數,能夠參考其餘函數
資料。工具
3. 非線性濾波matlab工具箱提供了兩個執行常規非線性濾波的函數:nlfilter和colfilt。nlfilter直接執行二維操做,而函數colfilt則以列的形式組織數據,雖然colfilt比nlfilter要佔用更多的內存,但執行速度要比nlfilter快許多,所以實際使用中若是注重速度,確定都是選擇的colfilt。spa
但兩個函數的使用方法很是的不一樣,特別是colfilt還有點難理解的地方,經過對colfilt的使用終於搞明白了其使用方法,下面對colfilt使用中要注意的地方進行總結。指針
4. colfilt的運行過程及解釋colfilt的原型以下:g=colfilt (f, [m n], 'sliding', @fun, parameters).內存
colfilt執行過程以下:ci
1. 首先對f進行列變換,假設f是MxN的圖像,則會生成一個mnxMN的矩陣。具體的變化方法要深入體會,其實就是把原圖像每一個像素鄰域內的mn個像素排成一列,原圖像總共有MN個像素,所以變換後的矩陣就有MN列。原型
2. 而後colfilt會每次選擇多列做爲一個矩陣傳入到fun中進行處理,到底選擇幾列是由colfilt按照必定策略進行的。而傳入矩陣的行數確定是mn。it
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,是爲了演示它的用法才用這樣的方法,採用兩次線性濾波,而後相加的方法進行速度要快的多!