Я пытаюсь реализовать простую 2-D функцию свертки в Python, используя эту формулу: Я написал следующую функцию:
def my_filter2D(X, H):
# make sure both X and H are 2-D
assert( X.ndim == 2)
assert( H.ndim == 2)
# get the horizontal and vertical size of X and H
X_size_x = X.shape[1]
X_size_y = X.shape[0]
H_size_x = H.shape[1]
H_size_y = H.shape[0]
# calculate the horizontal and vertical size of Y (assume "full" convolution)
Y_size_x = X_size_x + H_size_x - 1
Y_size_y = X_size_y + H_size_y - 1
# create an empty output array
Y = np.zeros((Y_size_y,Y_size_x))
# go over output locations
for m in range(Y_size_y):
for n in range(Y_size_x):
# go over input locations
for i in range(X_size_y):
for j in range(X_size_x):
if (m-i >= 0) and (m-i < X_size_y ) and (n-j >= 0) and (n-j < X_size_x):
Y[m,n] = Y[m,n] + H[i,j]*X[m-i,n-j]
# make sure kernel is within bounds
# calculate the convolution sum
return Y
Однако я получаю краевую проблему с следующий пример:
# test my 2-D convolution function
# 2-D input
X = np.array([[2, 1, 2, 3, 0],
[1, 3, 2, 1, 1],
[2, 3, 0, 1, 2],
[0, 1, 3, 2, 1]])
# 2-D filter kernel
H = np.array([[2, 4, -2],
[1, 2, -1]])
# call my function to calculate 2D convolution
Y = my_filter2D(X, H)
print("H: \n", H)
print("Y: \n", Y)
Ошибка:
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-4-19d8f5a83f29> in <module>
12
13 # call my function to calculate 2D convolution
---> 14 Y = my_filter2D(X, H)
15
16 print("H: \n", H)
<ipython-input-3-3ed9b29455a3> in my_filter2D(X, H)
35 for j in range(X_size_x):
36 if (m-i >= 0) and (m-i < X_size_y ) and (n-j >= 0) and (n-j < X_size_x):
---> 37 Y[m,n] = Y[m,n] + H[i,j]*X[m-i,n-j]
38 # make sure kernel is within bounds
39
IndexError: index 3 is out of bounds for axis 1 with size 3
Результат должен иметь тот же размер, что и входные данные. Центр ядра может быть в любом положении для этого примера.