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将内核放置在图像的1个像素上并将其扩展到内核为1的任何位置,而OpenCV将内核放在每个像素上并将其设置为其邻居的最大值(当内核为1时) )。
哪种行为是对的? Wikipedia's animation似乎更喜欢OpenCV。如果我调用了错误的函数,有没有办法用scipy重现OpenCV的行为?
附注:
grey_dilation
中(虽然我不希望它改变行为)答案 0 :(得分:1)
扩张有两种不同的定义,它们在结构元素的镜像中有所不同。两者都满足扩张的所有属性,因此没有“正确”的方法来做到这一点。两种定义都是有效的。
这两个图书馆使用相反的扩张定义。从一个到另一个,镜像结构元素。请注意,在2D中,镜像与旋转180度相同:
tker = np.array([[1,1,0],
[1,1,1],
[1,1,1]])
tker2 = np.rot90(tker, 2)