OpenCV的初步簡單講解——高斯模糊與卷積核,通俗易懂

OpenCV是一個非常實用的計算機視覺庫,現在它已經在諸多學科有應用,本文先暫不講OpenCV本身,而只簡單的講解如何實現opencv中如何模糊成像,與卷積的簡單介紹。

什麼是高斯模糊?

模糊當然是人眼睛看不清當然就感覺模糊啦!至於高斯,可能高斯這個人是近視吧。好,模糊就講到這為止。

當然不是這樣,模糊是一種利用圖像算法對源圖像素色值進行重新合成的一種處理結果,而高斯模糊則是運用高斯函數(遵循數據正態分佈)求出對應圖像的卷積核在進行一定換算最後合成圖像的一種特殊處理結果,當然其中有很多過程及概念,所以在瞭解高斯模糊成像的過程前,我們要先了解一下什麼是卷積核。

卷積核

一看非常高大上的名字,但是它其實就是通過某種算法(平常所聽的XX卷積,XXX卷積其實就是不同算法所得出的)得出的一個結果矩陣。首先我們知道圖像其實就是一個個的像素點所構成的矩陣排列,而通過高斯函數求出來的目標矩陣在與源矩陣進行卷積濾波之後就能得出結果矩陣就是我們最後模糊的圖像結果,效果如圖所示:

OpenCV的初步簡單講解——高斯模糊與卷積核,通俗易懂

卷積濾波

我們先把卷積核放到一邊,重點先看一下原像素是如何通過卷積濾波來得到目標像素的。如圖所示,如果我們想要得到圖中的目標像素(第二排第二列),那麼我需要同樣的找到原像素和原像素周圍的一圈像素(3*3的矩陣),然後根據周圍一圈的值進行加權運算。

(-1*3)+(0*0)+(1*1)+(-2*2)+(0*6)+(2*2)+(-1*2)+(0*4)+(1*1)=-3

通過計算我們便能得到目標像素的值為-3,其實這就是高斯模糊的過程,原像素矩陣就是通過一大堆的類似的運算來得到高斯模糊後的目標像素矩陣的,這就是模糊成像的過程。當然我們還需繼續理解一下模糊成像的原理。

模糊成像一般原理

我們現在僅僅瞭解模糊的一個過程那麼我們還應該知道模糊成像的一般原理是什麼樣的。

還是讓我們來畫個圖理解更好幫助解釋(我們先假設每個頭都是一個像素點):

OpenCV的初步簡單講解——高斯模糊與卷積核,通俗易懂

例1

如上圖所示,如果我們想對中心像素點可可蘿進行一次模糊處理那麼應該怎麼做,既然是模糊處理那麼就是要通過周邊像素的值來確定自身的值應該是多少,顯然照上圖來看的話,完成模糊處理很簡單,就是求出周邊的加權平均,由於周圍一圈全是臭鼬頭,所以顯而意見中間的可可蘿也會被平均計算成臭鼬頭。

即(臭鼬+臭鼬+臭鼬+臭鼬+可可蘿+臭鼬+臭鼬+臭鼬+臭鼬)/(9*臭鼬)=臭鼬
OpenCV的初步簡單講解——高斯模糊與卷積核,通俗易懂

噔噔咚

這樣得出的結果就已經是經過簡單的加權模糊後所生成的圖像了,當然要應用到正式的圖像模糊不可能通過這麼簡單的加權運算來得出模糊圖像,因為不管從運算效率、時間複雜度還是實際的模糊效果來說都太差了,接下來我們要開始瞭解一下如何通過算法來優化模型進行圖像模糊。

在統計學中有一個十分重要的權重分配模式叫“正態分佈”,在高斯模糊中也是圍繞正態分佈來求出適應的模糊值,我們接下來就會帶讀者來了解一下正態分佈,這可是在很多學科都有應用的一個重要理論(甚至連機械設計都要用,苦逼作者的禿頭生活)

OpenCV的初步簡單講解——高斯模糊與卷積核,通俗易懂

基數放大後就很難進行運算了

正態分佈的基本圖像

OpenCV的初步簡單講解——高斯模糊與卷積核,通俗易懂

正態分佈公式

正態分佈是研究定量現象的一個數學模型,其一般的圖像如下所示:

OpenCV的初步簡單講解——高斯模糊與卷積核,通俗易懂

標準正態分佈

很明顯,正態分佈圖像是一個呈鍾型的圖像,從圖中我們可以看出距離中心0的位置越小則函數的取值越大,同樣的曲度也會越大,處於中心點就能得到權重,隨著向周邊靠近取值遞減,將正態分佈模型運用到模糊運算時,就會可以做到指定的越中心的像素將會獲得更高的模糊權重,而偏外圍的像素將得到低權重的模糊,這樣就不會導致由於模糊的程度完全一樣所導致的圖像銜接問題。

高斯函數基礎介紹

使用正態分佈所得到的密度函數稱為高斯函數,其一維函數如下圖所示:

OpenCV的初步簡單講解——高斯模糊與卷積核,通俗易懂

一維高斯函數

其中,μ是x的平均均值,σ是x的方差。因為計算平均值的時候,中心點就是原點(0,0),所以在計算平均值時μ=0。

可以通過一維函數推導得到二維高斯函數(推導過程不做解釋,該去學概率論與數理統計啦!)。

OpenCV的初步簡單講解——高斯模糊與卷積核,通俗易懂

二維高斯函數

現在我們就能通過高斯函數來計算模糊所需要的權重矩陣了。

OpenCV的初步簡單講解——高斯模糊與卷積核,通俗易懂

原始矩陣

假定在此矩陣中的中心點的座標是(0,0),那麼距離它最近的8個點的座標如上圖所示。

為了計算權重矩陣,需要自己設定σ模糊半徑(指的就是你中心點與周圍像素的距離取值後所確定的值)。我們來定σ=1.5,則模糊半徑為1.5的權重矩陣如下:

OpenCV的初步簡單講解——高斯模糊與卷積核,通俗易懂

權重矩陣(1)

為了完成權重矩陣的歸一化,我們還需要對上面的各值進行除於他們的總值的計算,目的是讓最終的圖像通道的權重總值為1,不然使用總值大於1的卷積濾鏡會讓圖像偏亮,小於1的卷積濾鏡會讓圖像偏暗。這九個權重值的總和等於0.4787147,所以我們直接進行除法運算,得到以下的權重矩陣。

OpenCV的初步簡單講解——高斯模糊與卷積核,通俗易懂

權重矩陣(2)

這樣我們的權重矩陣也就是卷積濾波矩陣就大功告成了,當然還沒有完,假設我們有一個圖像矩陣也就是未經過處理的圖像矩陣,他們的灰度值如下圖所示(如果是彩色RGB圖像則需要分別計算3個通道的色值):

OpenCV的初步簡單講解——高斯模糊與卷積核,通俗易懂

灰度值矩陣

OpenCV的初步簡單講解——高斯模糊與卷積核,通俗易懂

計算後的灰度值

之後我們將權重矩陣對準源圖像的色值矩陣,然後將權重矩陣和色值矩陣相乘得出的結果全部相加就可以求出中心的模糊值。對一個圖像的所有點都進行如上過程,就能最終得到高斯模糊後的圖像。

關於高斯模糊與卷積核的介紹就到此為止了,如果有什麼疑問可以在評論中進行提問,作者會做到及時回覆。


分享到:


相關文章: