影象處理中的valid卷積與same卷積
阿新 • • 發佈:2020-06-20
#valid卷積
在full卷積的卷積過程中,會遇到$K_{flip}$靠近I的邊界(K矩陣與I矩陣),就會有部分延申到I之外,這時候忽略邊界,只考慮I*完全*覆蓋$K_{flip}$內的值情況,這個的過程就是valid卷積。一個高為H1,寬為W1的矩陣I與高為H2,寬為W2的矩陣K,在H1大於等於H2,W1大於等於W2的情況下,valid卷積的結果就是一個(H1-H2+1)*(W-W+1)的矩陣$C_{valid}$。
$$C_{valid}與C_{full}的對應關係為: C_{valid} = C_{full}( Rect (W_{2}-1,H_{2}-1,W_{1}-W_{2}+1,H_{1}-H_{2}+1) ) $$
#same卷積
無論是full卷積還是valid卷積都不會得到正好的尺寸,要麼比原尺寸大要麼比原尺寸小,這時就需要same卷積來解決這個問題。若想得到寬和高都正好的矩陣我們首先需要給$K_{flip}$一個錨點,將錨點放在(迴圈)影象矩陣的(r,c)處,((r,c)在矩陣之內),將對應位置的元素逐個相乘,最終將所有的積進行求和作為輸出影象矩陣在(r,c)處的輸出值。這個過程稱為same卷積。
OpenCv函式copyMakeBorder的引數表
|引數|解釋|
|--|--|
|src|輸入矩陣|
|dst|輸出矩陣|
|top|上側擴充的行數|
|bottom|下側擴充的行數|
|left|左側擴充的行數|
|right|右側擴充的行數|
|borderType|邊界擴充的型別|
|value|border Type= BORDER_CONSTANT事的常數|
其中borderType有多種型別,比如:BORDER_REPLICATE(邊界複製)、BORDER_CONSTANT(常數擴充)、BORDER_REFLECT(反射擴充)等。
在使用Python進行卷積操作時用到包Scipy,其中有關的操作函式為convolve2d(in1,in2,mode='full',boundary='fill',fillvalue=0)
|引數|解釋|
|--|--|
|in1|輸入陣列|
|in2|輸入陣列,代表K(卷積運算元)|
|mode|卷積型別,也就是以上提到的三種類型:full,valid,same|
|boundary|邊界填充:fill\wrap\symm|
|fillvalue|當boundary='fill'時,設定邊界填充的值,預設為0|
在這裡需要注意的是當model為same時卷積運算元的錨點位置由不同尺寸而不同,假設K(卷積運算元)的寬和高分別為W、H。
|W和H的值|錨點位置|
|--|--|
|均為奇數|預設為中心點|
|H為偶數、W為奇數|(H-1,(W-1)/2)|
|H為奇數,W為偶數|((H-1)/2,W-1)|
|均為偶數|(H-1,W-1)|
程式碼實現:
```
import numpy as np
from scipy import signal
if __name__ == "__main__":
I = np.array([[1,2],[3,4],np.float32])
#I的高和寬
H1,W1 = I.shape[:2]
#卷積運算元
k = np.array([[-1,-2],[2,1],np.float32])
#K的寬和高
H2,W2 = k.shape[:2]
#計算full卷積
c_full = signal.convolve2d(I,k,mode='full')
#設定錨點
r,c = 0,0
#根據錨點來從full卷積中擷取same卷積
c_same= c_full[H2-r-1:H1-r-1,W2-c-1:W1+W2-c