Почему generic_filter в scipy.ndimage получает другой результат от opencv.Sobel

1

Вот код для тестирования

    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

  • 0
    Фильтр OpenCV Sobel получает квадратный корень из суммы квадратов градиентов x и y. Похоже, ваш код учитывает только x-направление.
  • 0
    @MarkSetchell, но я установил параметр xorder и yorder на 1 и 0 соответственно
Показать ещё 1 комментарий
Теги:
opencv
scipy

1 ответ

0

Я думаю, что ваша функция должна читать:

def sobel_x_filter(P):
   return (P[2] + 2 * P[5] + P[8]) - (P[0] + 2 * P[3] + P[6])
  • 0
    Понятно, спасибо за помощь!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню