OpenCV 连通域提取质心 Python

引言

在计算机视觉和图像处理的领域中,连通域是指由相邻像素组成的图像区域。连通域提取是一项重要的任务,它可以用于目标检测、图像分割和特征提取等应用中。本文将介绍如何使用Python中的OpenCV库来提取连通域的质心。

连通域提取

连通域提取是一种将图像中的像素划分为不同的区域的方法。在OpenCV中,可以使用cv2.connectedComponents函数来实现连通域提取。该函数将返回图像中连通域的数量以及一个标记图像,其中每个连通域被标记为不同的整数值。

以下是一个使用OpenCV进行连通域提取的示例代码:

import numpy as np
import cv2

# 读取图像
image = cv2.imread('image.jpg', 0)

# 二值化图像
_, binary_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)

# 连通域提取
num_labels, labels = cv2.connectedComponents(binary_image)

# 创建一个空白图像用于可视化连通域
output = np.zeros_like(image, dtype=np.uint8)

# 绘制连通域
for label in range(1, num_labels):
    # 获取当前连通域的像素坐标
    mask = labels == label
    # 计算连通域的质心
    M = cv2.moments(mask)
    cX = int(M["m10"] / M["m00"])
    cY = int(M["m01"] / M["m00"])
    # 在输出图像上绘制质心
    cv2.circle(output, (cX, cY), 3, (255, 255, 255), -1)

# 显示结果
cv2.imshow('Output', output)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,我们首先读取一张图像并将其转换为灰度图像。然后,我们使用cv2.threshold函数将图像二值化,将其转换为黑白图像。接下来,我们使用cv2.connectedComponents函数提取图像中的连通域。该函数返回连通域的数量以及一个标记图像,其中每个连通域被标记为不同的整数值。

然后,我们创建一个与原始图像大小相同的空白图像,用于可视化连通域。使用cv2.moments函数计算每个连通域的质心,并使用cv2.circle函数在输出图像上绘制质心。最后,我们显示结果图像。

实例分析

现在,让我们通过一个具体的实例来实际应用连通域提取和质心计算。

假设我们有一张包含多个图形的图像,每个图形都是以黑色填充的闭合区域。我们的目标是提取每个图形的连通域,并计算每个连通域的质心。

首先,我们需要创建一个包含不同几何形状的图像。下面是一个示例代码,用于创建一个包含圆形、矩形和三角形的图像:

import numpy as np
import cv2

# 创建一个空白图像
image = np.zeros((300, 300), dtype=np.uint8)

# 绘制圆形
cv2.circle(image, (100, 100), 50, 255, -1)

# 绘制矩形
cv2.rectangle(image, (200, 200), (250, 250), 255, -1)

# 绘制三角形
pts = np.array([[50, 200], [150, 200], [100, 100]], np.int32)
pts = pts.reshape((-1, 1, 2))
cv2.polylines(image, [pts], True, 255)

# 显示图像
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,我们首先创建一个空白图像,并使用cv2.circlecv2.rectanglecv2.polylines函数绘制圆