什麼!卷積要旋轉180度?!

全文共988個字,6張圖,預計閱讀時間8分鐘。

一看這個標題就會想,這有什麼大驚小怪的,可能好多人覺得這是個腦殘話題,但我確實誤解了兩三年……

今天在讀《OpenCV算法精解》的時候,發現對兩個矩陣做卷積運算的時候,作爲卷積算子的矩陣要逆時針旋轉180度,這是以前從來沒注意過的步驟, 說來慚愧,平時都是直接調用API,忽略了原理,以爲卷積就是像很多圖上畫的,一個卷積核挨着掃描另一個矩陣,結果疊加起來,當初上數字圖像處理課的時候也手算過卷積,不知道是老師講錯了還是我記錯了,總之一直都沒注意到卷積運算其實是「先翻轉再平移」。

維基百科中這樣描述卷積的物理意義:

在泛函分析中,卷積、疊積、摺積或旋積,是通過兩個函數f和g生成第三個函數的一種數學算子,表徵函數f與經過翻轉和平移的g的乘積函數所圍成的曲邊梯形的面積。

連續卷積

數學定義是:

函數f和g是定義在Rn上的可測函數,f與g的卷積記做f*g,它是其中一個函數翻轉並平移後與另一個函數的乘積的積分,是一個對平移量的函數,也就是:

連續卷積公式(From Wikipedia)

知乎上有一個關於「如何通俗易懂地解釋卷積」的問答,有很多解釋版本,也都通俗易懂,挺有意思,但是個人認爲維基百科的下面這張圖用於理解卷積已經足夠。特別注意圈住的那句話,對理解卷積的意義很有幫助。

圖解卷積(From Wikipedia)

離散卷積

離散卷積(From Wikipedia)

Example

我主要做圖像處理,所以用到的是離散卷積。使用python做驗證。

下面這個圖是我們最常見的卷積運算圖:

卷積運算圖(來自百度圖片搜索)

中間的卷積核,其實是已經逆時針旋轉過180度的,即做卷積的兩個矩陣其實是[[2, 1, 0, 2, 3], [9, 5, 2,4, 2, 0], [2, 3, 4, 5, 6], [1, 2, 3, 1, 0], [0, 4, 4, 2, 8]]和[[1, 0, -1], [1, 0, -1], [1, 0, -1]],沒有旋轉只有乘積求和就不叫卷積運算。

先來兩個矩陣,根據公式手動推導一下:

手算卷積

可以發現,只有卷積核旋轉180度再掃描,纔會和公式推導計算的結果一樣,將I和K矩陣用python做卷積:

python卷積.png

和我們手算的一樣。所以自己做卷積的時候,記得「翻轉再平移」……或者乾脆用公式計算,至少不會錯。

原文鏈接:https://www.jianshu.com/p/3b3a6743cab7

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章