一看這個標(biāo)題就會想,這有什么大驚小怪的,可能好多人覺得這是個腦殘話題,但我確實誤解了兩三年……
今天在讀《OpenCV算法精解》的時候,發(fā)現(xiàn)對兩個矩陣做卷積運算的時候,作為卷積算子的矩陣要逆時針旋轉(zhuǎn)180度,這是以前從來沒注意過的步驟, 說來慚愧,平時都是直接調(diào)用API,忽略了原理,以為卷積就是像很多圖上畫的,一個卷積核挨著掃描另一個矩陣,結(jié)果疊加起來,當(dāng)初上數(shù)字圖像處理課的時候也手算過卷積,不知道是老師講錯了還是我記錯了,總之一直都沒注意到卷積運算其實是「先翻轉(zhuǎn)再平移」。
維基百科中這樣描述卷積的物理意義:
在泛函分析中,卷積、疊積、摺積或旋積,是通過兩個函數(shù)f和g生成第三個函數(shù)的一種數(shù)學(xué)算子,表征函數(shù)f與經(jīng)過翻轉(zhuǎn)和平移的g的乘積函數(shù)所圍成的曲邊梯形的面積。
連續(xù)卷積
數(shù)學(xué)定義是:
函數(shù)f和g是定義在Rn上的可測函數(shù),f與g的卷積記做f*g,它是其中一個函數(shù)翻轉(zhuǎn)并平移后與另一個函數(shù)的乘積的積分,是一個對平移量的函數(shù),也就是:

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

離散卷積

Example
我主要做圖像處理,所以用到的是離散卷積。使用python做驗證。
下面這個圖是我們最常見的卷積運算圖:

中間的卷積核,其實是已經(jīng)逆時針旋轉(zhuǎn)過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]],沒有旋轉(zhuǎn)只有乘積求和就不叫卷積運算。
先來兩個矩陣,根據(jù)公式手動推導(dǎo)一下:

可以發(fā)現(xiàn),只有卷積核旋轉(zhuǎn)180度再掃描,才會和公式推導(dǎo)計算的結(jié)果一樣,
將I和K矩陣用python做卷積:

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