【问题标题】:Python-OpenCV dilate and erode functions don't modify anythingPython-OpenCV dilate 和 erode 函数不会修改任何内容
【发布时间】:2015-03-18 20:37:28
【问题描述】:

鉴于下面的代码,python 中的 cv2.dilate 和 cv2.erode 函数返回我发送给它的相同图像。我究竟做错了什么?我正在使用 OpenCV3.0.0。和 iPython 2.7 上的 numpy1.9.0

im = np.zeros((100,100), dtype=np.uint8)
im[50:,50:] = 255
dilated = cv2.dilate(im, (11,11))
print np.array_equal(im, dilated)

返回:

True

{已编辑} 另一个扩张帖子代表了内核数据类型的问题。这个帖子实际上反映了一个函数调用错误。

【问题讨论】:

  • 我的想法是您没有指定内核的 dtype,因此它可能默认为 uint8 以外的其他值。但这可能只是您没有正确指定内核;你能用np.ones((11, 11), dtype=np.uint8)试试吗?

标签: python opencv


【解决方案1】:

该函数需要一个内核,而不是内核大小。所以下面是正确的函数调用。

dilated = cv2.dilate(im, np.ones((11, 11)))

【讨论】:

  • 仅仅在函数调用中指定一个内核会导致一个与函数不兼容的类型 int 元组 - 我会考虑重新措辞,因为这是不正确的。您应该在输入中指定一个内核,但 OP 没有这样做,因为它是一个元组。我想你的意思是指定一个 (11,11) 的元组是不正确的,应该指定一个正确的内核(即np.ones((11,11)))。顺便说一句,在这种情况下,指定 uint8dtype 是多余的。但是,我给了你一个 +1,因为你编写的代码在解决问题方面是正确的。
【解决方案2】:

您需要指定一个合适的内核。可以是矩形、圆形等。

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))
im = np.zeros((100,100), dtype=np.uint8)
im[50:,50:] = 255
dilated = cv2.dilate(im, kernel, iterations = 1)

【讨论】:

    【解决方案3】:

    我认为这与您修改数组的第二行有关。可能数据类型被感染了。

    【讨论】:

    • 没有。它不起作用,因为 OP 没有正确指定内核。请参阅此线程中 OP 的答案。
    【解决方案4】:

    函数必须以这种方式调用: cv2.dilate(img(输入), kernel, iterations = number(你要应用多少次过滤器)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      • 1970-01-01
      • 2021-09-06
      • 2019-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多