【问题标题】:cv2.connectedComponents not detecting componentscv2.connectedComponents 未检测到组件
【发布时间】:2017-09-18 17:47:42
【问题描述】:

我在 Ubuntu,python 2.7。使用 OpenCV。

我试图准确理解函数 cv2.connectedComponents 正在做什么。 这是图片:

代码:

import cv2
import numpy as np

img = cv2.imread('BN.tif', 0)

img = np.uint8(img)
_, markers = cv2.connectedComponents(img)
 

据我了解,这个函数创建了一个与提供的图像大小相同的数组。对于检测到的每个组件,为该组件的所有 (y,x) 位置分配相同的编号。如果背景全为“0”,则圆圈全为“1”,下一个正方形全为“2”,依此类推。最后一个组件应全为“19”。我通过获取定义组件的最高数字来读取组件的数量:

np.amax(markers)

我应该得到 19,但我得到 1。

我的问题:为什么我只得到 1 个组件?

【问题讨论】:

  • 因为前景物体应该是白色的,而背景是黑色的。反转图像! img = 255 - img;
  • 哎哟......我怎么会这样......这是正确的!谢谢

标签: python opencv


【解决方案1】:

这是因为cv2.connectedComponents() 仅将白色部分视为一个组件。因此,您得到的是单个组件。

您必须反转您的图像。您可以使用cv2.bitwise_not() 函数来做到这一点。

代码:

import cv2
import numpy as np

img = cv2.imread('cc.png', 0)
ret, thresh = cv2.threshold(img, 127, 255, 0)

#---- Inverting the image here ----
img = cv2.bitwise_not(thresh)     
_, markers = cv2.connectedComponents(img)
print np.amax(markers)

结果:

19

【讨论】:

  • 是的,你是对的。感谢 Miki 和 Jeru Luke 的正确答案。现在可以了。
  • 在我看来,使用cv2.THRESH_BINARY_INV 作为类型而不是阈值然后反转似乎更合乎逻辑。
  • @beaker Point 值得注意。但是这个问题的重点是在反转时找到连通分量。所以这就是为什么我实际上写了一个额外的行来突出图像反转
  • 对于 python3 将最后一行更改为 print(np.max(markers))
猜你喜欢
  • 1970-01-01
  • 2022-01-23
  • 2019-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
相关资源
最近更新 更多