圖像處理算法其實都很簡單
要學習高斯模糊我們首先要知道一些基本概念:
線性濾波與卷積的基本概念
線性濾波可以說是圖像處理最基本的方法,它可以允許我們對圖像進行處理,產生很多不同的效果。做法很簡單。首先,我們有一個二維的濾波器矩陣(有個高大上的名字叫卷積核)和一個要處理的二維圖像。然後,對於圖像的每一個像素點,計算它的鄰域像素和濾波器矩陣的對應元素的乘積,然後加起來,作爲該像素位置的值。這樣就完成了濾波過程。
對圖像和濾波矩陣進行逐個元素相乘再求和的操作就相當於將一個二維的函數移動到另一個二維函數的所有位置,這個操作就叫卷積或者協相關。卷積和協相關的差別是,卷積需要先對濾波矩陣進行 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、啥也不做
哈哈,大家可以看到啥了嗎?這個濾波器啥也沒有做,得到的圖像和原圖是一樣的。因爲只有中心點的值是 1。鄰域點的權值都是 0,對濾波後的取值沒有任何影響。
下面我們動點真格的。
2、圖像銳化濾波器 Sharpness Filter
圖像的銳化和邊緣檢測很像,首先找到邊緣,然後把邊緣加到原來的圖像上面,這樣就強化了圖像的邊緣,使圖像看起來更加銳利了。這兩者操作統一起來就是銳化濾波器了,也就是在邊緣檢測濾波器的基礎上,再在中心的位置加 1,這樣濾波後的圖像就會和原始的圖像具有同樣的亮度了,但是會更加銳利。
我們把核加大,就可以得到更加精細的銳化效果
另外,下面的濾波器會更強調邊緣:
主要是強調圖像的細節。最簡單的 3x3 的銳化濾波器如下:
大家應該也看出來了,銳化濾波器實際上就是計算當前點和周圍點的差別,然後將這個差別加到原來的位置上。
3、邊緣檢測 Edge Detection
我們要找水平的邊緣:需要注意的是,這裏矩陣的元素和是 0,所以濾波後的圖像會很暗,只有邊緣的地方是有亮度的。
爲什麼這個濾波器可以尋找到水平邊緣呢?因爲用這個濾波器卷積相當於求導的離散版本:你將當前的像素值減去前一個像素值,這樣你就可以得到這個函數在這兩個位置的差別或者斜率。下面的濾波器可以找到垂直方向的邊緣,這裏像素上和下的像素值都使用:
再下面這個濾波器可以找到 45 度的邊緣:取 - 2 不爲了什麼,只是爲了讓矩陣的元素和爲 0 而已。
那下面這個濾波器就可以檢測所有方向的邊緣:
爲了檢測邊緣,我們需要在圖像對應的方向計算梯度。用下面的卷積核來卷積圖像,就可以了。但在實際中,這種簡單的方法會把噪聲也放大了。另外,需要注意的是,矩陣所有的值加起來要是 0.
4、浮雕 Embossing Filter
浮雕濾波器可以給圖像一種 3D 陰影的效果。只要將中心一邊的像素減去另一邊的像素就可以了。這時候,像素值有可能是負數,我們將負數當成陰影,將正數當成光,然後我們對結果圖像加上 128 的偏移。這時候,圖像大部分就變成灰色了。
下面是 45 度的浮雕濾波器
我們只要加大濾波器,就可以得到更加誇張的效果了
這種效果非常的漂亮,就像是將一副圖像雕刻在一塊石頭上面一樣,然後從一個方向照亮它。它和前面的濾波器不同,它是非對稱的。另外,它會產生負數值,所以我們需要將結果偏移,以得到圖像灰度的範圍。
A:原圖像。B:銳化。C:邊緣檢測。D:浮雕
5、運動模糊 Motion Blur
運動模糊可以通過只在一個方向模糊達到,例如下面 9x9 的運動模糊濾波器。注意,求和結果要除以 9。
這個效果就好像,攝像機是從左上角移動的右下角。
看了一些好玩的濾波器後我們可以進入主題了,首先來看均值模糊:
均值模糊 Box Filter (Averaging)
我們可以將當前像素和它的四鄰域的像素一起取平均,然後再除以 5,或者直接在濾波器的 5 個地方取 0.2 的值即可,如下圖:
可以看到,這個模糊還是比較溫柔的,我們可以把濾波器變大,這樣就會變得粗暴了:注意要將和再除以 13.
所以,如果你想要更模糊的效果,加大濾波器的大小即可。或者對圖像應用多次模糊也可以。
高斯模糊
其實模糊濾波器就是對周圍像素進行加權平均處理,均值模糊很簡單,周圍像素的權值都相同,所以不是很平滑。高斯模糊就有這個優點,所以被廣泛用在圖像降噪上。特別是在邊緣檢測之前,都會用來移除細節。那麼下面我們就看看高斯模糊的權值是如何分配的。
正態分佈的權重
正態分佈顯然是一種可取的權重分配模式。 在圖形上,正態分佈是一種鐘形曲線,越接近中心,取值越大,越遠離中心,取值越小。 計算平均值的時候,我們只需要將 "中心點" 作爲原點,其他點按照其在正態曲線上的位置,分配權重,就可以得到一個加權平均值。
高斯函數
上面的正態分佈是一維的,圖像都是二維的,所以我們需要二維的正態分佈。
正態分佈的密度函數叫做 "高斯函數"(Gaussian function)。它的一維形式是:
其中,μ是 x 的均值,σ是 x 的標準差。因爲計算平均值的時候,中心點就是原 點,所以μ等於 0。即:
根據一維高斯函數,可以推導得到二維高斯函數:
有了這個函數 ,就可以計算每個點的權重了。
假定中心點的座標是(0,0),那麼距離它最近的 8 個點的座標如下:
更遠的點以此類推。下面就是 5*5 的高斯濾波器和平滑效果:
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/10f1WkuQT-74gZPcDZYO5g