matlab中用colfilt實現非線性濾波

1. 圖像的空域線性濾波和非線性濾波

在空域對圖像進行濾波處理無非兩種狀況,線性濾波和非線性濾波。濾波的意思就是對原圖像的每一個像素周圍必定範圍內的像素進行運算,運算的範圍就稱爲掩膜或領域。而運算就分兩種了,若是運算只是對各像素灰度值進行簡單處理(如乘一個權值)最後求和,就稱爲線性濾波;而若是對像素灰度值的運算比較複雜,而不是最後求和的簡單運算,則是非線性濾波;如求一個像素周圍3x3範圍內最大值、最小值、中值、均值等操做都不是簡單的加權,都屬於非線性濾波。vim

2. 線性濾波

Matlab進行線性濾波可使用imfilter函數,使用很是的方便。ide

  • g=imfilter (f, w, ltering_mode, boundary_options, size_options)

具體的使用方法就不細說了。掩膜的生成可使用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).內存

  • f:要進行濾波的原圖像
  • [m,n]:掩膜(鄰域)的尺寸,通常爲奇數*奇數
  • 'sliding':塊模式,sliding說明逐個像素的滑動mxn區域
  • @fun:真是實現濾波的函數,它是一個函數指針,咱們定義一個函數對mxn區域的像素進行處理,而這個函數會被colfilt自動調用。
  • 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,是爲了演示它的用法才用這樣的方法,採用兩次線性濾波,而後相加的方法進行速度要快的多!

相關文章
相關標籤/搜索