一看這個(gè)標(biāo)題就會(huì)想培慌,這有什么大驚小怪的豁陆,可能好多人覺得這是個(gè)腦殘?jiān)掝},但我確實(shí)誤解了兩三年……
今天在讀《OpenCV算法精解》的時(shí)候吵护,發(fā)現(xiàn)對(duì)兩個(gè)矩陣做卷積運(yùn)算的時(shí)候盒音,作為卷積算子的矩陣要逆時(shí)針旋轉(zhuǎn)180度,這是以前從來沒注意過的步驟馅而, 說來慚愧祥诽,平時(shí)都是直接調(diào)用API,忽略了原理瓮恭,以為卷積就是像很多圖上畫的雄坪,一個(gè)卷積核挨著掃描另一個(gè)矩陣,結(jié)果疊加起來屯蹦,當(dāng)初上數(shù)字圖像處理課的時(shí)候也手算過卷積维哈,不知道是老師講錯(cuò)了還是我記錯(cuò)了绳姨,總之一直都沒注意到卷積運(yùn)算其實(shí)是「先翻轉(zhuǎn)再平移」。
維基百科中這樣描述卷積的物理意義:
在泛函分析中阔挠,卷積飘庄、疊積、摺積或旋積购撼,是通過兩個(gè)函數(shù)f和g生成第三個(gè)函數(shù)的一種數(shù)學(xué)算子跪削,表征函數(shù)f與經(jīng)過翻轉(zhuǎn)和平移的g的乘積函數(shù)所圍成的曲邊梯形的面積。
連續(xù)卷積
數(shù)學(xué)定義是:
函數(shù)f和g是定義在Rn上的可測(cè)函數(shù)迂求,f與g的卷積記做f*g切揭,它是其中一個(gè)函數(shù)翻轉(zhuǎn)并平移后與另一個(gè)函數(shù)的乘積的積分,是一個(gè)對(duì)平移量的函數(shù)锁摔,也就是:
知乎上有一個(gè)關(guān)于「如何通俗易懂地解釋卷積」的問答,有很多解釋版本哼审,也都通俗易懂谐腰,挺有意思,但是個(gè)人認(rèn)為維基百科的下面這張圖用于理解卷積已經(jīng)足夠涩盾。特別注意圈住的那句話十气,對(duì)理解卷積的意義很有幫助。
離散卷積
Example
我主要做圖像處理春霍,所以用到的是離散卷積砸西。使用python做驗(yàn)證。
下面這個(gè)圖是我們最常見的卷積運(yùn)算圖:
中間的卷積核址儒,其實(shí)是已經(jīng)逆時(shí)針旋轉(zhuǎn)過180度的芹枷,即做卷積的兩個(gè)矩陣其實(shí)是[[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)只有乘積求和就不叫卷積運(yùn)算莲趣。
先來兩個(gè)矩陣鸳慈,根據(jù)公式手動(dòng)推導(dǎo)一下:
可以發(fā)現(xiàn),只有卷積核旋轉(zhuǎn)180度再掃描喧伞,才會(huì)和公式推導(dǎo)計(jì)算的結(jié)果一樣走芋,
將I和K矩陣用python做卷積:
和我們手算的一樣。所以自己做卷積的時(shí)候潘鲫,記得「翻轉(zhuǎn)再平移」……或者干脆用公式計(jì)算翁逞,至少不會(huì)錯(cuò)。