转载 图像卷积
個(gè)人總結(jié):為什么要翻轉(zhuǎn)卷積核?
卷積的概念來(lái)源于數(shù)學(xué)的卷積公式,而卷積核是按照卷積公式給出的,它和要處理的像素塊之間位置不對(duì)應(yīng),翻轉(zhuǎn)之后就一一對(duì)應(yīng)了,就可以直接在程序中對(duì)應(yīng)相乘再相加,也就是說(shuō)我們拿到一個(gè)卷積核后,可以手動(dòng)先把它反轉(zhuǎn)好,然后輸入到程序中,這樣在程序中就不用翻轉(zhuǎn)了,整個(gè)程序執(zhí)行過(guò)程中并沒(méi)有所謂卷積的概念,公式,只有簡(jiǎn)單的數(shù)學(xué)相乘和相加而已
?
?
原文鏈接:https://blog.csdn.net/alvinlyb/article/details/78892252??
?
參考鏈接:
http://www.cnblogs.com/freeblues/p/5738987.html
http://blog.csdn.net/chaipp0607/article/details/72236892?locationNum=9&fps=1
神經(jīng)網(wǎng)絡(luò)中的卷積層,它的原理就來(lái)源于圖像卷積
概述
卷積在信號(hào)處理領(lǐng)域有極其廣泛的應(yīng)用, 也有嚴(yán)格的物理和數(shù)學(xué)定義. 本文只討論卷積在數(shù)字圖像處理中的應(yīng)用.
在數(shù)字圖像處理中, 有一種基本的處理方法:線性濾波. 待處理的平面數(shù)字圖像可被看做一個(gè)大矩陣, 圖像的每個(gè)像素對(duì)應(yīng)著矩陣的每個(gè)元素, 假設(shè)我們平面的分辨率是?1024*768, 那么對(duì)應(yīng)的大矩陣的行數(shù)=?1024,?列數(shù)=768.
用于濾波的是一個(gè)濾波器小矩陣(也叫卷積核), 濾波器小矩陣一般是個(gè)方陣, 也就是?行數(shù)?和?列數(shù)?相同, 比如常見(jiàn)的用于邊緣檢測(cè)的?Sobel 算子?就是兩個(gè)?3*3?的小矩陣.
進(jìn)行濾波就是對(duì)于大矩陣中的每個(gè)像素, 計(jì)算它周圍像素和濾波器矩陣對(duì)應(yīng)位置元素的乘積, 然后把結(jié)果相加到一起, 最終得到的值就作為該像素的新值, 這樣就完成了一次濾波.
上面的處理過(guò)程可以參考這個(gè)示意圖:
圖像卷積計(jì)算示意圖:
對(duì)圖像大矩陣和濾波小矩陣對(duì)應(yīng)位置元素相乘再求和的操作就叫卷積(Convolution)或協(xié)相關(guān)(Correlation).
協(xié)相關(guān)(Correlation)和卷積(Convolution)很類似, 兩者唯一的差別就是卷積在計(jì)算前需要翻轉(zhuǎn)卷積核, 而協(xié)相關(guān)則不需要翻轉(zhuǎn).
以 Sobel 算子為例
Sobel 算子?也叫?Sobel 濾波, 是兩個(gè)?3*3?的矩陣, 主要用來(lái)計(jì)算圖像中某一點(diǎn)在橫向/縱向上的梯度, 看了不少網(wǎng)絡(luò)上講解?Sobel 算子?的文章, 發(fā)現(xiàn)人們常常把它的橫向梯度矩陣和縱向梯度矩陣混淆. 這可能與?Sobel 算子?在它的兩個(gè)主要應(yīng)用場(chǎng)景中的不同用法有關(guān).
Sobel 算子的兩個(gè)梯度矩陣: Gx 和 Gy
這里以?Wiki?資料為準(zhǔn),?Sobel 算子?有兩個(gè)濾波矩陣:?Gx?和?Gy,?Gx?用來(lái)計(jì)算橫向的梯度,?Gy?用來(lái)計(jì)算縱向的梯度, 下圖就是具體的濾波器:
?
- 注意:這里列出的這兩個(gè)梯度矩陣對(duì)應(yīng)于橫向從左到右, 縱向從上到下的坐標(biāo)軸, 也就是這種:
- 1
- 2
- 3
- 4
- 5
- 6
Sobel 算子的用途
它可以用來(lái)對(duì)圖像進(jìn)行邊緣檢測(cè), 或者用來(lái)計(jì)算某個(gè)像素點(diǎn)的法線向量. 這里需要注意的是:
- 邊緣檢測(cè)時(shí):?Gx?用于檢測(cè)縱向邊緣,?Gy?用于檢測(cè)橫向邊緣.
- 計(jì)算法線時(shí):?Gx?用于計(jì)算法線的橫向偏移,?Gy?用于計(jì)算法線的縱向偏移.
計(jì)算展開(kāi)
假設(shè)待處理圖像的某個(gè)像素點(diǎn)周圍的像素如下:
| 左 | 中心像素 | 右 |
| 左下 | 下 | 右下 |
那么用?Gx?計(jì)算展開(kāi)為:
橫向新值 = (-1)*[左上] + (-2)*[左] + (-1)*[左下] + 1*[右上] + 2*[右] + 1*[右下]- 1
用?Gy?計(jì)算展開(kāi)為:
縱向新值 = (-1)*[左上] + (-2)*[上] + (-1)*[右] + 1*[左下] + 2*[下] + 1*[右下]- 1
前面說(shuō)過(guò), 做圖像卷積時(shí)需要翻轉(zhuǎn)卷積核, 但是我們上面的計(jì)算過(guò)程沒(méi)有顯式翻轉(zhuǎn), 這是因?yàn)?Sobel 算子?繞中心元素旋轉(zhuǎn)?180?度后跟原來(lái)一樣. 不過(guò)有些?卷積核?翻轉(zhuǎn)后就變了, 下面我們?cè)敿?xì)說(shuō)明如何翻轉(zhuǎn)卷積核.
卷積核翻轉(zhuǎn)
前面說(shuō)過(guò), 圖像卷積計(jì)算, 需要先翻轉(zhuǎn)卷積核, 也就是繞卷積核中心旋轉(zhuǎn)?180度, 也可以分別沿兩條對(duì)角線翻轉(zhuǎn)兩次, 還可以同時(shí)翻轉(zhuǎn)行和列, 這3種處理都可以得到同樣的結(jié)果.
對(duì)于第一種卷積核翻轉(zhuǎn)方法, 一個(gè)簡(jiǎn)單的演示方法是把卷積核寫在一張紙上, 用筆尖固定住中心元素, 旋轉(zhuǎn)?180?度, 就看到翻轉(zhuǎn)后的卷積核了.
下面演示后兩種翻轉(zhuǎn)方法, 示例如下:
假設(shè)原始卷積核為:
| d | e | f |
| g | h | i |
方法2:沿兩條對(duì)角線分別翻轉(zhuǎn)兩次
先沿左下角到右上角的對(duì)角線翻轉(zhuǎn), 也就是?a和i,?b和f,?d和h交換位置, 結(jié)果為:
| h | e | b |
| g | d | a |
再沿左上角到右下角的對(duì)角線翻轉(zhuǎn), 最終用于計(jì)算的卷積核為:
| f | e | d |
| c | b | a |
方法3:同時(shí)翻轉(zhuǎn)行和列
在?Wiki?中對(duì)這種翻轉(zhuǎn)的描述:
convolution is the process of flipping both the rows and columns of the kernel and then multiplying locationally similar entries and summing.
也是把卷積核的行列同時(shí)翻轉(zhuǎn), 我們可以先翻轉(zhuǎn)行, 把?a b c跟?g h i?互換位置, 結(jié)果為:
| d | e | f |
| a | b | c |
再翻轉(zhuǎn)列, 把?g d a?和?i f c?互換位置, 結(jié)果為:
| f | e | d |
| c | b | a |
在?Wiki?中有一個(gè)計(jì)算展開(kāi)式, 也說(shuō)明了這種翻轉(zhuǎn):
?
- 注意:這里要跟矩陣乘法區(qū)分開(kāi), 這里只是借用了矩陣符號(hào), 實(shí)際做的是對(duì)應(yīng)項(xiàng)相乘, 再求和.
圖像邊緣像素的處理
以上都默認(rèn)待處理的像素點(diǎn)周圍都有像素, 但是實(shí)際上圖像邊緣的像素點(diǎn)周圍的像素就不完整, 比如頂部的像素在它上方就沒(méi)有像素點(diǎn)了, 而圖像的四個(gè)角的像素點(diǎn)的相鄰像素更少, 我們以一個(gè)圖像矩陣為例:
| … | … | … | … | … |
| 左側(cè) | … | … | … | 右側(cè) |
| … | … | … | … | … |
| 左下角 | … | ? | … | 右下角 |
位于左上角的像素點(diǎn)的周圍就只有右側(cè)和下方有相鄰像素, 遇到這種情況, 就需要補(bǔ)全它所缺少的相鄰像素,就是網(wǎng)絡(luò)中的padding操作;
時(shí)域卷積 = 頻域相乘
時(shí)域卷積 = 頻域相乘
時(shí)域卷積 = 頻域相乘
?
不同卷積核下卷積意義
我們經(jīng)常能看到的,平滑,模糊,去燥,銳化,邊緣提取等等工作,其實(shí)都可以通過(guò)卷積操作來(lái)完成,下面我們一一舉例說(shuō)明一下:?
(1)一個(gè)沒(méi)有任何作用的卷積核:?
?
將原像素中間像素值乘1,其余全部乘0,顯然像素值不會(huì)發(fā)生任何變化。?
(2)平滑均值濾波:?
選擇卷積核:?
?
該卷積核的作用在于取九個(gè)值的平均值代替中間像素值,所以起到的平滑的效果:?
?
?
(3)高斯平滑:?
卷積核:?
?
高斯平滑水平和垂直方向呈現(xiàn)高斯分布,更突出了中心點(diǎn)在像素平滑后的權(quán)重,相比于均值濾波而言,有著更好的平滑效果。?
?
(4)圖像銳化:?
卷積核:?
?
該卷積利用的其實(shí)是圖像中的邊緣信息有著比周圍像素更高的對(duì)比度,而經(jīng)過(guò)卷積之后進(jìn)一步增強(qiáng)了這種對(duì)比度,從而使圖像顯得棱角分明、畫面清晰,起到銳化圖像的效果。?
?
除了上述卷積核,邊緣銳化還可以選擇:?
?
(5)梯度Prewitt:?
水平梯度:?
?
?
垂直梯度:?
?
梯度Prewitt卷積核與Soble卷積核的選定是類似的,都是對(duì)水平邊緣或垂直邊緣有比較好的檢測(cè)效果。
(6)Soble邊緣檢測(cè):?
Soble與上述卷積核不同之處在于,Soble更強(qiáng)調(diào)了和邊緣相鄰的像素點(diǎn)對(duì)邊緣的影響。?
水平梯度:?
?
?
垂直梯度:?
?
以上的水平邊緣與垂直邊緣檢測(cè)問(wèn)題可以參考:Soble算子水平和垂直方向?qū)?shù)問(wèn)題
(7)梯度Laplacian:
卷積核:?
Laplacian也是一種銳化方法,同時(shí)也可以做邊緣檢測(cè),而且邊緣檢測(cè)的應(yīng)用中并不局限于水平方向或垂直方向,這是Laplacian與soble的區(qū)別。下面這張圖可以很好的表征出二者的區(qū)別:來(lái)源于OpenCV官方文檔?
卷積的一些作用還參考了網(wǎng)上的一些解釋,羅列如下:
(1)
(2)
一種是濾波,比如最簡(jiǎn)單的高斯模板,就是把模板內(nèi)像素乘以不同的權(quán)值然后加起來(lái)作為模板的中心像素值,如果模板取值全為1,就是滑動(dòng)平均;如果模板取值為高斯,就是加權(quán)滑動(dòng)平均,權(quán)重是中間高,四周低,在頻率上理解就是低通濾波器;如果模板取值為一些邊緣檢測(cè)的模板,結(jié)果就是模板左邊的像素減右邊的像素,或者右邊的減左邊的,得到的就是圖像梯度,方向不同代表不同方向的邊緣;
另一種理解是投影,因?yàn)楫?dāng)前模板內(nèi)部圖像和模板的相乘累加操作就是圖像局部patch和模板的內(nèi)積操作,如果把patch和模板拉直,拉直的向量看成是向量空間中的向量,那么這個(gè)過(guò)程就是patch向模板方向上的投影,一幅圖像和一個(gè)模板卷積,得到的結(jié)果就是圖像各個(gè)patch在這個(gè)方向上的response map或者feature map;如果這樣的模板有一組,我們可以把這一組看成一組基,得到的一組feature map就是原圖像在這組基上的投影。常見(jiàn)的如用一組Garbor濾波器提取圖像的特征,以及卷積神經(jīng)網(wǎng)絡(luò)中的第一層,圖像在各個(gè)卷積核上的投影。總結(jié)
- 上一篇: 发现一个骨灰级图形学大神的博客
- 下一篇: C++二维数组名的再探索