如何在python中使用openCV的连接组件和stats?

时间:2016-03-07 21:16:44

标签: python opencv connected-components

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

3 个答案:

答案 0 :(得分:68)

该功能的工作原理如下:

# 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]

标签是输入图像大小的矩阵,其中每个元素的值都等于其标签。

统计信息是函数计算的统计信息矩阵。它的长度等于标签数量,宽度等于统计数量。它可以与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位置。此矩阵中的行对应于标签号。

答案 1 :(得分:5)

添加到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答案时,它无法正常工作,这是我的解决方案。

答案 2 :(得分:2)

我来这里几次是为了记住它的工作原理,每次我都必须将上面的代码简化为:

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

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