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
中(尽管我不认为它会改变行为)发布于 2018-06-04 04:37:12
膨胀有两种不同的定义,它们在结构元素的镜像上有所不同。两者都满足膨胀的所有属性,因此没有“正确”的方法。这两个定义都是有效的。
这两个库使用了相反的膨胀定义。要从一个元素转到另一个元素,请镜像结构化元素。请注意,在2D中,镜像与旋转180度相同:
tker = np.array([[1,1,0],
[1,1,1],
[1,1,1]])
tker2 = np.rot90(tker, 2)
https://stackoverflow.com/questions/50668212
复制相似问题