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