Вот код для тестирования
import numpy as np
import cv2
from scipy.ndimage import generic_filter
def sobel_x_filter(P):
return (P[2] + 2 * P[6] + P[7]) - (P[0] + 2 * P[3] + P[6])
matrix = np.ones((100, 100))
matrix[1, 2] = 2
cv2_result = cv2.Sobel(np.float32(matrix), cv2.CV_32F, 1, 0)
generic_filter_result = generic_filter(matrix, sobel_x_filter, (3, 3))
И cv2_result[1, :]
равен [ 0., 2., 0., -2., 0.,..., 0.]
,
но generic_filter_result[1, :]
равен [0., 0., 0., -2., 0., 0., 0.,..., 0.]
.
Я совершенно запутался, почему результат отличается, я пытался изменить mode
параметра в функции generic_filter
в mirror
или wrap
, еще он произвел такой же результат, как и раньше, и не в соответствии с результатом cv2.Sobel
Я думаю, что ваша функция должна читать:
def sobel_x_filter(P):
return (P[2] + 2 * P[5] + P[8]) - (P[0] + 2 * P[3] + P[6])