首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >OpenCV的dilate与scipy、matlab不同

OpenCV的dilate与scipy、matlab不同
EN

Stack Overflow用户
提问于 2018-06-03 23:51:22
回答 1查看 494关注 0票数 2
代码语言:javascript
复制
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:

代码语言:javascript
复制
>>> 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:

代码语言:javascript
复制
>>> 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中(尽管我不认为它会改变行为)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-04 04:37:12

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

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

代码语言:javascript
复制
tker = np.array([[1,1,0],
                 [1,1,1],
                 [1,1,1]])
tker2 = np.rot90(tker, 2)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50668212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档