【计算机视觉】超简单!连通量分析的经典案例

Hey小伙伴们!今天来给大家分享一个 计算机视觉 中非常经典且实用的案例——连通量分析(Connected Component Analysis, CCA)。连通量分析是图像处理中的一种常用技术,用于识别和标记图像中的不同对象或区域。它在很多场景下都非常有用,比如物体检测、字符识别、医学图像分割等。

如果你对计算机视觉感兴趣,或者想学习如何用 Python 处理图像,那这篇笔记一定要收藏哦!????


???? 什么是连通量分析?

连通量分析是一种基于像素邻接关系的图像分割方法。它的核心思想是:对于二值图像(黑白图像),将相邻的白色像素(前景)归为同一个连通区域,并为每个连通区域分配一个唯一的标签。通过这种方式,我们可以轻松地识别出图像中的不同对象或区域。

  • 连通性:常见的连通性有 4-连通8-连通。4-连通只考虑上下左右四个方向的邻接关系,而 8-连通则包括对角线方向。

  • 应用场景

    • 物体检测:识别图像中的多个独立物体。
    • 字符识别:分离图像中的字符。
    • 医学图像分割:识别组织或器官的不同部分。

???? 案例场景:识别手写数字中的连通区域

我们来实现一个简单的案例:使用连通量分析来识别手写数字图像中的连通区域。我们将使用 Python 的 OpenCVscikit-image 库来处理图像,并展示如何提取和标记连通区域。


???? 代码实现
1. 安装依赖库

首先,确保你已经安装了以下依赖库:

pip install opencv-python scikit-image matplotlib numpy
2. 加载并预处理图像

我们将使用一张手写数字的图像作为示例。你可以从网上下载一张手写数字的图片,或者使用 OpenCV 自带的 MNIST 数据集。

import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage import measure

# 读取图像(假设是一张手写数字的灰度图像)
image = cv2.imread('handwritten_digits.png', cv2.IMREAD_GRAYSCALE)

# 显示原始图像
plt.figure(figsize=(8, 6))
plt.imshow(image, cmap='gray')
plt.title('原始图像')
plt.axis('off')
plt.show()
3. 二值化图像

为了进行连通量分析,我们需要将图像转换为二值图像。可以通过设定一个阈值,将图像中的像素分为前景(白色)和背景(黑色)。

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

# 显示二值化后的图像
plt.figure(figsize=(8, 6))
plt.imshow(binary_image, cmap='gray')
plt.title('二值化图像')
plt.axis('off')
plt.show()
4. 执行连通量分析

使用 scikit-imagemeasure.label 函数来进行连通量分析。该函数会为每个连通区域分配一个唯一的标签。

# 执行连通量分析
labels = measure.label(binary_image, connectivity=2)  # 8-连通

# 统计每个连通区域的属性
properties = measure.regionprops(labels)

# 显示带有标签的图像
plt.figure(figsize=(8, 6))
plt.imshow(labels, cmap='nipy_spectral')
plt.title('连通量分析结果')
plt.axis('off')
plt.show()

print(f"共检测到 {len(properties)} 个连通区域")
5. 提取并显示单个连通区域

我们可以根据连通区域的属性(如面积、坐标等)来提取并显示单个连通区域。例如,我们可以提取面积较大的连通区域,认为它们可能是手写数字。

# 提取面积大于一定阈值的连通区域
min_area = 50  # 设置最小面积阈值
filtered_labels = np.zeros_like(labels)

for region in properties:
    if region.area >= min_area:
        filtered_labels[labels == region.label] = region.label

# 显示过滤后的连通区域
plt.figure(figsize=(8, 6))
plt.imshow(filtered_labels, cmap='nipy_spectral')
plt.title('过滤后的连通区域')
plt.axis('off')
plt.show()
6. 绘制连通区域的边界框

我们还可以为每个连通区域绘制边界框,帮助我们更直观地理解每个区域的位置和大小。

# 创建一个新的图像用于绘制边界框
bbox_image = cv2.cvtColor(binary_image, cv2.COLOR_GRAY2RGB)

# 绘制每个连通区域的边界框
for region in properties:
    if region.area >= min_area:
        min_row, min_col, max_row, max_col = region.bbox
        cv2.rectangle(bbox_image, (min_col, min_row), (max_col, max_row), (0, 255, 0), 2)

# 显示带有边界框的图像
plt.figure(figsize=(8, 6))
plt.imshow(bbox_image)
plt.title('带有边界框的连通区域')
plt.axis('off')
plt.show()

???? 关键点解析
  1. 二值化:通过设定阈值将图像转换为二值图像,这是连通量分析的前提。cv2.threshold 函数可以很方便地实现这一点。

  2. 连通量分析:使用 scikit-imagemeasure.label 函数进行连通量分析,connectivity=2 表示使用 8-连通(包括对角线方向)。你可以根据需要选择 4-连通或 8-连通。

  3. 区域属性regionprops 函数可以获取每个连通区域的属性,如面积、坐标、边界框等。这些属性可以帮助我们进一步筛选和处理连通区域。

  4. 过滤连通区域:通过设置面积阈值,我们可以过滤掉一些小的噪声区域,保留较大的连通区域,认为它们可能是我们要识别的对象(如手写数字)。

  5. 绘制边界框:使用 cv2.rectangle 函数为每个连通区域绘制边界框,帮助我们更直观地理解每个区域的位置和大小。


???? 更多扩展
  1. 形态学操作:在连通量分析之前,可以使用形态学操作(如膨胀、腐蚀)来清理图像中的噪声,提升连通量分析的效果。

  2. 特征提取:除了面积和边界框,regionprops 还提供了许多其他有用的特征,如质心、惯性矩、Euler 数等。你可以根据具体需求提取不同的特征。

  3. 字符识别:结合连通量分析和 OCR(光学字符识别)技术,可以实现手写字符的自动识别。你可以使用 Tesseract 或其他 OCR 工具来识别提取出来的连通区域。

  4. 医学图像分割:连通量分析在医学图像分割中也有广泛应用,比如识别 X 光片中的骨骼、CT 图像中的器官等。


???? 总结与应用

通过这个简单的手写数字识别案例,我们可以看到连通量分析在图像处理中的强大功能。它不仅可以帮助我们识别图像中的不同对象,还能为后续的特征提取和分类提供基础。

连通量分析的应用非常广泛,除了手写字符识别,还可以用于物体检测、医学图像分割、工业缺陷检测等多个领域。希望这篇笔记能帮助大家更好地理解和应用连通量分析技术!


???? 更多资源
  • OpenCV 官方文档
  • scikit-image 官方文档
  • Matplotlib 官方文档

运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

???? 结语

今天的分享就到这里啦!希望这篇笔记能帮助大家更好地理解和应用连通量分析技术。如果你觉得有用,别忘了点赞、收藏哦!如果有任何问题或想法,欢迎在评论区留言交流,喜欢我的小伙伴,请点赞,收藏并关注我,我们一起学习进步!????

上一篇:Bootstrap Blazor中使用PuppeteerSharp对HTML截图


下一篇:k8s集群安装keepalive+haproxy