【问题标题】:OpenCV's dilate differs from scipy, matlabOpenCV的扩张不同于scipy、matlab
【发布时间】:2018-11-13 01:24:49
【问题描述】:
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 中(虽然我不希望它改变行为)

【问题讨论】:

  • 有没有办法用 scipy 重现 OpenCV 的行为? 当然,只需创建一个自定义内核(OpenCV 中使用的那个)并使用它。

标签: python matlab opencv scipy image-morphology


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢。那么 3d 膨胀,在 2 个轴上旋转呢?
  • 回答我自己:翻转所有轴:tker2 = tker[::-1,::-1,::-1]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多