import numpy as np
import cv2
import scipy.ndimage as sn
timg = np.array([[0,0,0,0],
[0,0,1,0],
[0,0,0,0],
[0,0,0,0]])
tker = np.array([[1,1,0],
[1,1,1],
[1,1,1]])
scipy.ndimage:
>>> print(sn.morphology.binary_dilation(timg,tker).astype(int))
[[0 1 1 0]
[0 1 1 1]
[0 1 1 1]
[0 0 0 0]]
OpenCV:
>>> print(cv2.dilate(timg.astype(np.uint8), tker.astype(np.uint8)))
[[0 1 1 1]
[0 1 1 1]
[0 0 1 1]
[0 0 0 0]]
Кажется, что ndimage помещает ядро в один пиксель изображения и расширяет его до тех пор, покаkernel равен 1, в то время как OpenCV помещает ядро в каждый пиксель и устанавливает его на максимум своих соседей (когда ядро равно 1).
Какое поведение является правильным? Анимация Википедии , кажется, поддерживает OpenCV.Если я вызываю неправильные функции, есть ли способ воспроизвести поведение OpenCV с помощью scipy?
Примечания:
- matlab ведет себя как scipy
- поведение scipyтакже происходит в
grey_dilation
(хотя я бы не ожидал, что это изменит поведение)