【问题标题】:Check if pixel is inside a connected component in opencv python检查像素是否在opencv python中的连接组件内
【发布时间】:2019-10-15 05:36:25
【问题描述】:

我正在对一个图像进行阈值处理,这会给我一些白色区域。我有一个位于这些区域之一的像素位置。我正在使用 opencv connectedComponentsWithStats 获取区域,然后查找像素是否在这些区域中的任何一个中。我该怎么做?

关于这一点,是否有更好的方法来查找该像素位于哪个阈值区域?

【问题讨论】:

    标签: python opencv region connected-components image-thresholding


    【解决方案1】:
    numLabels, labelImage, stats, centroids = cv2.connectedComponentsWithStats(thresh, connectivity, cv2.CV_32S)
    

    numLabels = 阈值图像中标签或区域的数量

    labelImage = 包含代表每个区域的唯一标签(1, 2, 3..)的矩阵或图像,背景在 labelImage 中表示为 0。

    stats = stats 是一个统计矩阵,其中包含有关区域的信息。

    centroids = 每个区域的质心。

    在你的情况下,你可以使用 labelImage 找出像素坐标上的唯一标签值,以找出它位于哪个区域。

    【讨论】:

    • 感谢您的回答。只是为了澄清一下, labelImage 到底代表什么?它是每个区域的所有像素的多维数组吗?如果是这样,为什么 numLabels 与 len(labelImage) 方式不同?例如4 对 375
    • labelImage 代表您每个区域的唯一标签。它为带有相应唯一标签的连接像素标记相同的唯一标签。这里每个区域都有一个从 1 到 n 的唯一编号。由于背景不属于任何区域,因此被赋予“0”标签只是为了与其他区域区分开来。 labelImage 是一个多维数组。当您执行 len(labelImage) 时,您将获得 numpy 数组的长度,即图像的高度。您可以在这里尝试使用 numpy.unique 来获取 labelImage 中存在的唯一值。
    • 我想我开始明白它是如何工作的了。另一个问题。如何访问/显示某个标签?例如我有 4 个标签,我想显示标签 1。
    • 要访问坐标值,您可以使用 np.where(labelImage == 1)。要显示,您可以在空白图像上绘制这些点以获得仅具有该坐标的区域。
    • 是的,您可以使用 matplotlib.pyplot.imshow 函数来查看 labelImage 以更深入地了解它的外观。
    【解决方案2】:

    您可以使用pointPolygonTest 函数来检查一个点是否在轮廓内。

    因此,在阈值化之后,使用findContours 函数找到图像中的轮廓。然后你可以将轮廓和点传递给这个函数来检查点是否在区域内。

    由于您拥有连接的组件和统计信息(您使用 connectedComponentsWithStats 找到的),因此您可以使用 this 方法更快地进行测试。

    【讨论】:

      猜你喜欢
      • 2015-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      相关资源
      最近更新 更多