Python opencv连通域

1、求解连通域

        Opencv 连通域函数connectedComponentsWithStats

        num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(image)

        输入:

        image:必须是二值化图像,检测的连通域为白色部分。

        输出:

        num_labels:所有连通域的数目

        labels:图像上每一像素的标记,用数字1、2、3…表示(不同的数字表示不同的连通域)

       stats:每一个标记的统计信息,是一个5列的矩阵,每一行对应每个连通区域的外接矩形的 x(左上角)、y(左上角)、width(宽度)、height(高度)和面积(点的数量),示例如下: 0 0 720 720 291805。

        centroids:连通域的中心。

2、示例代码

import cv2
import numpy as np

if __name__ == '__main__':
    image = np.zeros((640, 640)).astype(np.uint8)
    #绘制圆形
    image = cv2.circle(image, (100, 100), 50, 255, -1)
    #绘制多边形
    points = [[200, 200], [300, 100], [400, 400], [250, 300]]
    cv2.fillPoly(image, np.array([points]), 255, cv2.LINE_AA)
    #绘制矩形
    cv2.rectangle(image, (200,500), (500, 600), 255, -1)
    cv2.imshow('image', image)
    num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(image)
    print('num_labels: ', num_labels)
    labels[labels>0] = 255
    labels = labels.astype(np.uint8)
    #将一维灰度图像扩展到三维
    labels= np.expand_dims(labels,axis=2).repeat(3,axis=2).astype(np.uint8)
    for st in stats[1:]:
        cv2.rectangle(labels, (st[0], st[1]), (st[0]+st[2], st[1]+st[3]), (0, 255, 0), 3)
    cv2.imshow('labels', labels)
    cv2.waitKey(0)

3、测试结果

 

更多三维、二维感知算法和金融量化分析算法请关注“乐乐感知学堂”微信公众号,并将持续进行更新。

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
OpenCV提供了一些用于连通域分析的函数,可以帮助我们找到图像中的连通域(也称为连通组件)。连通域是由具有相同像素值或特定属性的像素组成的区域。下面是使用OpenCV进行连通域分析的一般步骤: 1. 首先,将图像转换为二进制形式,确保要分析的对象是白色,背景是黑色。可以使用阈值化或其他图像分割方法来实现这一点。 2. 使用OpenCV的`connectedComponents`函数执行连通域分析。该函数将返回一个标记图像和对象数量。标记图像中的每个对象都被分配一个唯一的整数值,背景像素为0。 3. 如果需要获取每个连通域的属性(如面积、边界框、中心点等),可以使用OpenCV的`connectedComponentsWithStats`函数。该函数除了返回标记图像和对象数量外,还返回一个状态矩阵,其中包含每个对象的属性。 下面是一个使用OpenCV进行连通域分析的示例代码: ```pythonimport cv2#读取图像image = cv2.imread('image.png',0) #二值化图像_, binary_image = cv2.threshold(image,127,255, cv2.THRESH_BINARY) # 连通域分析num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(binary_image) # 打印对象数量print("Number of objects:", num_labels -1) # 遍历每个对象的属性for i in range(1, num_labels): # 获取对象的面积 area = stats[i, cv2.CC_STAT_AREA] # 获取对象的边界框 x, y, width, height = stats[i, cv2.CC_STAT_LEFT], stats[i, cv2.CC_STAT_TOP], stats[i, cv2.CC_STAT_WIDTH], stats[i, cv2.CC_STAT_HEIGHT] # 获取对象的中心点 centroid_x, centroid_y = centroids[i] # 打印对象属性 print(f"Object {i}: Area={area}, Bounding Box=({x}, {y}, {width}, {height}), Centroid=({centroid_x}, {centroid_y})") ``` 请注意,此示例假设输入图像为灰度图像,如果使用彩色图像,需要进行适当的色彩空间转换。另外,该示例仅打印了对象的一些基本属性,你可以根据需要扩展代码以满足特定的需求。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coding的叶子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值