1. 程式人生 > >影象處理中濾波器(卷積核)

影象處理中濾波器(卷積核)

 

本文主要參考來源:影象處理其實很簡單

線性濾波和卷積的關係:線性濾波可以說是影象處理最基本的方法,它可以允許我們對影象進行處理,產生很多不同的效果。做法很簡單。首先,我們有一個二維的濾波器矩陣(有個高大上的名字叫卷積核)和一個要處理的二維影象。然後,對於影象的每一個畫素點,計算它的鄰域畫素和濾波器矩陣的對應元素的乘積,然後加起來,作為該畫素位置的值。這樣就完成了濾波過程。

  卷積或者協相關:對影象和濾波矩陣進行逐個元素相乘再求和的操作就相當於將一個二維的函式移動到另一個二維函式的所有位置。卷積和協相關的差別是,卷積需要先對濾波矩陣進行180的翻轉,但如果矩陣是對稱的,那麼兩者就沒有什麼差別了。

   Correlation 和 Convolution可以說是影象處理最基本的操作,但卻非常有用。這兩個操作有兩個非常關鍵的特點:它們是線性的,而且具有平移不變性shift-invariant。平移不變性指我們在影象的每個位置都執行相同的操作。線性指這個操作是線性的,也就是我們用每個畫素的鄰域的線性組合來代替這個畫素。這兩個屬性使得這個操作非常簡單,因為線性操作是最簡單的,然後在所有地方都做同樣的操作就更簡單了。

  2D卷積需要4個巢狀迴圈4-double loop,所以它並不快,除非我們使用很小的卷積核。這裡一般使用3x3或者5x5。而且,對於濾波器,也有一定的規則要求:

      1)濾波器的大小應該是奇數,這樣它才有一箇中心,例如3x3,5x5或者7x7。有中心了,也有了半徑的稱呼,例如5x5大小的核的半徑就是2。

      2)濾波器矩陣所有的元素之和應該要等於1,這是為了保證濾波前後影象的亮度保持不變。當然了,這不是硬性要求了。

      3)如果濾波器矩陣所有元素之和大於1,那麼濾波後的影象就會比原影象更亮,反之,如果小於1,那麼得到的影象就會變暗。如果和為0,影象不會變黑,但也會非常暗。

      4)對於濾波後的結構,可能會出現負數或者大於255的數值。對這種情況,我們將他們直接截斷到0和255之間即可。對於負數,也可以取絕對值。

神奇的卷積核

      上面說到,對影象的濾波處理就是對影象應用一個小小的卷積核,那這個小小的卷積核到底有哪些魔法。下面我們一起來領略下一些簡單但不簡單的卷積核的魔法。

  • 1、啥也不做,相當於影象的複製:

  • 2、影象銳化濾波器Sharpness Filter 

影象的銳化和邊緣檢測很像,首先找到邊緣,然後把邊緣加到原來的影象上面,這樣就強化了影象的邊緣,使影象看起來更加銳利了。這兩者操作統一起來就是銳化濾波器了,也就是在邊緣檢測濾波器的基礎上,再在中心的位置加1,這樣濾波後的影象就會和原始的影象具有同樣的亮度了,但是會更加銳利。

我們把核加大,就可以得到更加精細的銳化效果:

另外,下面的濾波器會更強調邊緣:

主要是強調影象的細節。最簡單的3x3的銳化濾波器如下:

   大家應該也看出來了,銳化濾波器實際上就是計算當前點和周圍點的差別,然後將這個差別加到原來的位置上。

  •  3、邊緣檢測Edge Detection

我們要找水平的邊緣:需要注意的是,這裡矩陣的元素和是0,所以濾波後的影象會很暗,只有邊緣的地方是有亮度的。

為什麼這個濾波器可以尋找到水平邊緣呢?因為用這個濾波器卷積相當於求導的離散版本:你將當前的畫素值減去前一個畫素值,這樣你就可以得到這個函式在這兩個位置的差別或者斜率。下面的濾波器可以找到垂直方向的邊緣,這裡畫素上和下的畫素值都使用:

 再下面這個濾波器可以找到45度的邊緣:取-2不為了什麼,只是為了讓矩陣的元素和為0而已。

那下面這個濾波器就可以檢測所有方向的邊緣:

為了檢測邊緣,我們需要在影象對應的方向計算梯度。用下面的卷積核來卷積影象,就可以了。但在實際中,這種簡單的方法會把噪聲也放大了。另外,需要注意的是,矩陣所有的值加起來要是0.

  • 4、浮雕Embossing Filter

浮雕濾波器可以給影象一種3D陰影的效果。只要將中心一邊的畫素減去另一邊的畫素就可以了。這時候,畫素值有可能是負數,我們將負數當成陰影,將正數當成光,然後我們對結果影象加上128的偏移。這時候,影象大部分就變成灰色了。

下面是45度的浮雕濾波器:

我們只要加大濾波器,就可以得到更加誇張的效果了:

這種效果非常的漂亮,就像是將一副影象雕刻在一塊石頭上面一樣,然後從一個方向照亮它。它和前面的濾波器不同,它是非對稱的。另外,它會產生負數值,所以我們需要將結果偏移,以得到影象灰度的範圍。

 

  •  5、運動模糊Motion Blur

運動模糊可以通過只在一個方向模糊達到,例如下面9x9的運動模糊濾波器。注意,求和結果要除以9。

這個效果就好像,攝像機是從左上角移動的右下角。

 

看了一些好玩的濾波器後我們可以進入主題了,首先來看均值模糊

均值模糊Box Filter (Averaging)

我們可以將當前畫素和它的四鄰域的畫素一起取平均,然後再除以5,或者直接在濾波器的5個地方取0.2的值即可,如下圖:

可以看到,這個模糊還是比較溫柔的,我們可以把濾波器變大,這樣就會變得粗暴了:注意要將和再除以13.

   所以,如果你想要更模糊的效果,加大濾波器的大小即可。或者對影象應用多次模糊也可以。

 

 

高斯模糊

      其實模糊濾波器就是對周圍畫素進行加權平均處理,均值模糊很簡單,周圍畫素的權值都相同,所以不是很平滑。高斯模糊就有這個優點,所以被廣泛用在影象降噪上。特別是在邊緣檢測之前,都會用來移除細節。那麼下面我們就看看高斯模糊的權值是如何分配的。