Реализация двумерной свертки в Python - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь реализовать простую 2-D функцию свертки в Python, используя эту формулу: formula Я написал следующую функцию:

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

Результат должен иметь тот же размер, что и входные данные. Центр ядра может быть в любом положении для этого примера.

1 Ответ

1 голос
/ 05 марта 2020

Вы проверяете диапазоны для i и j в зависимости от размера ввода X.

 for i in range(X_size_y):
       for j in range(X_size_x):

Однако вы получаете доступ к элементам ядра с одинаковыми индексами в H[i,j], таким образом, когда i>H_size_y (то же самое для j), вы получаете ошибку выхода за границы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...