Итак, я пытаюсь выполнить свертку 2D-изображения, используя горизонтальное ядро 3x3, которое выглядит следующим образом:
horizontal = np.array([
[0, 0, 0],
[-1, 0, 1],
[0, 0, 0]]),
Так что я использую приведенную ниже функцию свертки, где я зацикливаюсь на изображении, начиная с игнорирования первых нескольких пикселей (размер ядра) и умножения и добавления
def perform_convolution(k_h, k_w, img_h, img_w, kernel, picture):
# k_w = kernel width, k_h = kernel_height
# img_h = image height, img_w = image width
conv = np.zeros(picture.shape)
for i in range(k_h, img_h - (k_h)):
for j in range(k_w, img_w - (k_w)):
tot = 0
for m in range(k_h):
for n in range(k_w):
tot = tot + kernel[m][n] * picture[i - (k_h) + m][j - (k_w) + n]
conv[i][j] = tot
return conv
Но вывод, который я получаю, совершенно странный, как показано ниже
В качестве альтернативы, используя ядро из PIL, я получаю правильное размытое изображение, подобное этому,
Так может ли кто-нибудь помочь мне понять, где я ошибаюсь?
Я пробовал ту же функцию с ядрами коробки, и она работает просто отлично, но я не могу понять, почему вывод это так странно.
Я также пытался разделить полосы RGB и свертывать их отдельно, но безрезультатно.
Исходное изображение таково: