OpenCV的扩张不同于scipy,matlab

时间:2018-06-03 15:51:22

标签: python matlab opencv scipy image-morphology

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的行为?

附注:

  • matlab表现得像scipy
  • scipy的行为也发生在grey_dilation中(虽然我不希望它改变行为)

1 个答案:

答案 0 :(得分:1)

扩张有两种不同的定义,它们在结构元素的镜像中有所不同。两者都满足扩张的所有属性,因此没有“正确”的方法来做到这一点。两种定义都是有效的。

这两个图书馆使用相反的扩张定义。从一个到另一个,镜像结构元素。请注意,在2D中,镜像与旋转180度相同:

tker = np.array([[1,1,0],
                 [1,1,1],
                 [1,1,1]])
tker2 = np.rot90(tker, 2)