如何在python中使用openCV的连接组件和统计信息?
Posted
技术标签:
【中文标题】如何在python中使用openCV的连接组件和统计信息?【英文标题】:How to use openCV's connected components with stats in python? 【发布时间】:2016-06-21 14:53:33 【问题描述】:我正在寻找如何在 python 中使用 OpenCV 的 ConnectedComponentsWithStats() 函数的示例,请注意这仅适用于 OpenCV 3 或更高版本。官方文档仅显示了 C++ 的 API,即使该函数在为 python 编译时存在。我在网上的任何地方都找不到。
【问题讨论】:
【参考方案1】:我来这里几次是为了记住它是如何工作的,每次我都必须将上面的代码简化为:
_, thresh = cv2.threshold(src,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
connectivity = 4 # You need to choose 4 or 8 for connectivity type
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(thresh , connectivity , cv2.CV_32S)
希望它对每个人都有用:)
【讨论】:
【参考方案2】:添加到Zack Knopp
答案,
如果您使用的是灰度图像,您可以简单地使用:
import cv2
import numpy as np
src = cv2.imread("path\\to\\image.png", 0)
binary_map = (src > 0).astype(np.uint8)
connectivity = 4 # or whatever you prefer
output = cv2.connectedComponentsWithStats(binary_map, connectivity, cv2.CV_32S)
当我尝试在灰度图像上使用 Zack Knopp
答案时,它不起作用,这是我的解决方案。
【讨论】:
【参考方案3】:函数的作用如下:
# Import the cv2 library
import cv2
# Read the image you want connected components of
src = cv2.imread('/directorypath/image.bmp')
# Threshold it so it becomes binary
ret, thresh = cv2.threshold(src,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# You need to choose 4 or 8 for connectivity type
connectivity = 4
# Perform the operation
output = cv2.connectedComponentsWithStats(thresh, connectivity, cv2.CV_32S)
# Get the results
# The first cell is the number of labels
num_labels = output[0]
# The second cell is the label matrix
labels = output[1]
# The third cell is the stat matrix
stats = output[2]
# The fourth cell is the centroid matrix
centroids = output[3]
标签是输入图像大小的矩阵,其中每个元素的值等于其标签。
Stats 是函数计算的统计数据矩阵。它的长度等于标签的数量,宽度等于统计的数量。它可以与 OpenCV 文档一起使用:
每个标签的统计输出,包括背景标签,见 下面是可用的统计数据。统计数据通过访问 stats[label, COLUMN] 可用列定义如下。
cv2.CC_STAT_LEFT 最左边 (x) 坐标,即边界框在水平方向上的包含起点。 cv2.CC_STAT_TOP 最高 (y) 坐标,它是边界框在垂直方向上的包含起点。 cv2.CC_STAT_WIDTH边界框的水平尺寸 cv2.CC_STAT_HEIGHT边界框的垂直尺寸 cv2.CC_STAT_AREA 连通分量的总面积(以像素为单位)
质心 是一个矩阵,其中包含每个质心的 x 和 y 位置。此矩阵中的行对应于标签编号。
【讨论】:
我必须说,出于某种原因,我不得不使用 cv2.THRESH_BINARY 而不是 cv2.THRESH_BINARY+cv2.THRESH_OTSU,然后我必须将 src 转换为整数和 thresh 以使其浮动工作。我不知道为什么,但它没有工作。 @ypnos 对于具有统计信息的连接组件,您不需要这样做,但对于没有统计信息的连接组件则需要这样做。我认为那部分只是我以另一种方式完成的。我现在修好了。干杯! 有人能解释一下如何使用这些标签吗?如何检查质心是否是什么标签? 图像中的每个组件都有一个数字(标签)。背景为标签 0,附加对象编号从 1 到num_labels-1
。质心由与标签相同的数字索引。 centroids[0]
并不是特别有用——它只是背景。 centroids[1:num_labels]
是你想要的。
@matchifang 你可以创建一个包含组件区域的数组:areas=output[2][:,4]
然后一个包含组件数量的数组:nr=np.arange(output[0])
然后根据区域大小对它们进行排序:ranked=sorted(zip(areas,nr))
在这里的帮助下:***.com/questions/6618515/…以上是关于如何在python中使用openCV的连接组件和统计信息?的主要内容,如果未能解决你的问题,请参考以下文章