Свертка 3D изображения с 2D фильтром - PullRequest
1 голос
/ 10 февраля 2020

У меня есть одно изображение формы img.shape = (500, 439, 3)

Функция свертки

def convolution(image, kernel, stride=1, pad=0):

    n_h, n_w, _ = image.shape

    f = kernel.shape[0]
    kernel = np.repeat(kernel[None,:], 3, axis=0)

    n_H = int(((n_h + (2*pad) - f) / stride) + 1)
    n_W = int(((n_w + (2*pad) - f) / stride) + 1)
    n_C = 1

    out = np.zeros((n_H, n_W, n_C))

    for h in range(n_H):
        vert_start = h*stride
        vert_end = h*stride + f

        for w in range(n_W):
            horiz_start = w*stride
            horiz_end = w*stride + f

            for c in range(n_C):
                a_slice_prev = image[vert_start:vert_end,
                                     horiz_start:horiz_end, :]

                s = np.multiply(a_slice_prev, kernel)
                out[h, w, c] = np.sum(s, dtype=float)

    return out

Я хочу видеть изображение после любого ядра / фильтра, примененного к изображению, поэтому я получил следующее

img = plt.imread('cat.png')
kernel = np.arange(25).reshape((5, 5))
out2 = convolution(img, kernel)
plt.imshow(out2)
plt.show()

Я получил

s = np.multiply (a_slice_prev, kernel)

ValueError: операнды не могли быть переданы вместе с фигурами ( 5,5,3) (3,5,5)

Ответы [ 2 ]

2 голосов
/ 11 февраля 2020

np.multiply выполняет поэлементное умножение. Однако ваши аргументы не имеют соответствующих размеров. Вы можете транспонировать ваше ядро ​​или образ таким образом, чтобы он мог работать:

kernel = kernel.transpose()

Вы можете сделать это до вашего np.multiply вызова.

0 голосов
/ 11 февраля 2020

ValueError: операнды не могут передаваться вместе с фигурами (5,5,3) (3,5,5)

Поскольку Convolution является поэлементным умножением, ваши фигуры должно быть (5,5,3) для области изображения и (5,5,3) для ядра, поэтому повторите ваше ядро ​​следующим образом:

kernel = np.arange(25).reshape((5, 5, 1))
kernel = np.repeat(kernel, 3, axis=2)
...