# 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]
_, 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)
4条答案
按热度按时间kcugc4gi1#
函数的工作方式如下:
标签是一个输入图像大小的矩阵,其中每个元素的值等于其标签。
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位置的矩阵。此矩阵中的行对应于标签编号。
utugiqy62#
我来这里几次记住它是如何工作的,每次我都要把上面的代码简化为:
希望它对每个人都有用:)
u3r8eeie3#
添加到
Zack Knopp
答案,如果您使用的是灰度图像,您可以简单地用途:当我尝试在灰度图像上使用
Zack Knopp
答案时,它不起作用,这就是我的解决方案。8cdiaqws4#
输入图像需要是单通道的。所以首先转换为灰度,否则会导致opencv 4.x中的错误,您需要转换为灰度,然后Zack的答案。