gpt4 book ai didi

python - OpenCV的扩张不同于scipy,matlab

转载 作者:太空宇宙 更新时间:2023-11-03 21:31:58 25 4
gpt4 key购买 nike

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 中(尽管我不希望它改变行为)

最佳答案

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

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

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

关于python - OpenCV的扩张不同于scipy,matlab,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50668212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com