66

我正在寻找如何在 python 中使用 OpenCV 的 ConnectedComponentsWithStats() 函数的示例,请注意这仅适用于 OpenCV 3 或更高版本。官方文档仅显示了 C++ 的 API,即使该函数在为 python 编译时存在。我在网上的任何地方都找不到。

4

3 回答 3

132

该功能的工作原理如下:

# 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连通分量的总面积(以像素为单位)

Centroids是一个矩阵,其中包含每个质心的 x 和 y 位置。该矩阵中的行对应于标签编号。

于 2016-03-07T21:16:44.240 回答
17

我来这里几次以记住它是如何工作的,每次我都必须将上面的代码减少到:

_, 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)

希望它对每个人都有用:)

于 2018-11-13T19:57:09.237 回答
10

添加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在灰度图像上使用答案时,它不起作用,这是我的解决方案。

于 2018-03-05T14:48:53.570 回答