OpenCV学习记录python实现连通域处理函数

 更新时间:2022年06月07日 09:27:15   作者:胖大海pyh  
这篇文章主要为大家介绍了OpenCV学习记录python实现连通域处理函数cv2.connectedComponentsWithStats()和cv2.connectedComponents()的使用示例详解

1、两个函数介绍

总得来说,connectedComponents()仅仅创建了一个标记图(图中不同连通域使用不同的标记,和原图宽高一致),connectedComponentsWithStats()可以完成上面任务,除此之外,还可以返回每个连通区域的重要信息–bounding box, area, andcentroid。

1.1什么是连通域

连通区域一般是指图像中具有相同像素值且位置相邻的前景像素点组成的图像区域。连通区域分析是指将图像中的各个连通区域找出并标记。

连通区域分析是一种在CVPR和图像分析处理的众多应用领域中较为常用和基本的方法。

例如:OCR识别中字符分割提取(车牌识别、文本识别、字幕识别等)、视觉跟踪中的运动前景目标分割与提取(行人入侵检测、遗留物体检测、基于视觉的车辆检测与跟踪等)、医学图像处理(感兴趣目标区域提取)、等等。也就是说,在需要将前景目标提取出来以便后续进行处理的应用场景中都能够用到连通区域分析方法,通常连通区域分析处理的对象是一张二值化后的图像。

1.2 cv2.connectedComponents()

函数各参数意义:

num_objects, labels = cv2.connectedComponents(image)

参数介绍如下: 

image:也就是输入图像,必须是二值图,即8位单通道图像。(因此输入图像必须先进行二值化处理才能被这个函数接受)

返回值: 

num_labels:所有连通域的数目

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

1.3 cv2.connectedComponentsWithStats()

这个函数的作用是对一幅图像进行连通域提取,并返回找到的连通域的信息:retval、labels、stats、centroids

num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(image, connectivity=8, ltype=None)

参数介绍如下: 

  • image:也就是输入图像,必须是二值图,即8位单通道图像。(因此输入图像必须先进行二值化处理才能被这个函数接受) 
  • connectivity:可选值为4或8,也就是使用4连通还是8连通。 
  • ltype:输出图像标记的类型,目前支持CV_32S 和 CV_16U。

返回值:

  • num_labels:所有连通域的数目 
  • labels:图像上每一像素的标记,用数字1、2、3…表示(不同的数字表示不同的连通域) 
  • stats:每一个标记的统计信息,是一个5列的矩阵,每一行对应每个连通区域的外接矩形的x、y、width、height和面积,示例如下: 0 0 720 720 291805 
  • centroids:连通域的中心点

2、代码实践

两个代码的用处是共通的,cv2.connectedComponentsWithStats函数返回的信息量更大,所以这里展示它的应用。

import cv2
import numpy as np
# 读入图片
img = cv2.imread("001.jpg")
# 中值滤波,去噪
img = cv2.medianBlur(img, 3)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.namedWindow('original', cv2.WINDOW_AUTOSIZE)
cv2.imshow('original', gray)
# 阈值分割得到二值化图片
ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
# 膨胀操作
kernel2 = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
bin_clo = cv2.dilate(binary, kernel2, iterations=2)
# 连通域分析
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(bin_clo, connectivity=8)
# 查看各个返回值
# 连通域数量
print('num_labels = ',num_labels)
# 连通域的信息:对应各个轮廓的x、y、width、height和面积
print('stats = ',stats)
# 连通域的中心点
print('centroids = ',centroids)
# 每一个像素的标签1、2、3.。。,同一个连通域的标签是一致的
print('labels = ',labels)
# 不同的连通域赋予不同的颜色
output = np.zeros((img.shape[0], img.shape[1], 3), np.uint8)
for i in range(1, num_labels):
    mask = labels == i
    output[:, :, 0][mask] = np.random.randint(0, 255)
    output[:, :, 1][mask] = np.random.randint(0, 255)
    output[:, :, 2][mask] = np.random.randint(0, 255)
cv2.imshow('oginal', output)
cv2.waitKey()
cv2.destroyAllWindows()

打印出的连通域的信息如下: 

重点是理解stats和 labels 参数的意义,其他的参数都容易理解: 

labels :对原始图中的每一个像素都打上标签,背景为0,连通域打上1,2,3。。。的标签,同一个连通域的像素打上同样的标签。相当与对每一个像素进行了分类(分割) 

stats:每一连通域的信息,表示每个连通区域的外接矩形(起始点的x、y、宽和高)和面积

 

连通域检测的效果图:

3、总结

(1)连通域分析可以实现将前景目标提取出来以便后续进行处理(类似于轮廓处理)

(2)重点是cv2.connectedComponentsWithStats函数中stats和 labels 参数的意义 

labels :对原始图中的每一个像素都打上标签,背景为0,连通域打上1,2,3。。。的标签,同一个连通域的像素打上同样的标签。相当与对每一个像素进行了分类(分割) 

stats:每一连通域的信息,表示每个连通区域的外接矩形(起始点的x、y、宽和高)和面积

(3)从上面的例子可以看出,因物体有重叠会把不同物体的多个连通域 计为一个连通域,所以在连通域分析前可以先进行效果更好的分割和预处理操作。

以上就是OpenCV学习记录python实现连通域处理函数的详细内容,更多关于python opencv连通域处理函数的资料请关注脚本之家其它相关文章!

相关文章

  • Django Rest framework之认证的实现代码

    Django Rest framework之认证的实现代码

    这篇文章主要介绍了Django Rest framework之认证的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • opencv3/C++图像像素操作详解

    opencv3/C++图像像素操作详解

    今天小编就为大家分享一篇opencv3/C++图像像素操作详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Python中10个常用的内置函数详解

    Python中10个常用的内置函数详解

    这篇文章主要为大家介绍了Python常用的内置函数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • Python 更快进行探索性数据分析的四个方法

    Python 更快进行探索性数据分析的四个方法

    今天我给大家分享几种更快的探索性数据分析方法,它们可以进一步加速 EDA。 我们以一个学生考试成绩的例子,创建一个如下所示的 DataFrame 并继续操作。欢迎收藏学习,喜欢点赞支持
    2021-11-11
  • Python3实现建造者模式的示例代码

    Python3实现建造者模式的示例代码

    这篇文章主要介绍了Python3 实现建造者模式的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • 浅析python内置模块collections

    浅析python内置模块collections

    collections是Python内建的一个集合模块,提供了许多有用的集合类。这篇文章主要介绍了python内置模块collections的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • python 计算概率密度、累计分布、逆函数的例子

    python 计算概率密度、累计分布、逆函数的例子

    这篇文章主要介绍了python 计算概率密度、累计分布、逆函数的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • python实现sqlalchemy的使用概述

    python实现sqlalchemy的使用概述

    SQLAlchemy是Python中最有名的ORM工具,特点是操纵Python对象而不是SQL查询,也就是在代码层面考虑的是对象,而不是SQL,体现的是一种程序化思维,这样使得Python程序更加简洁易懂,具体内容详情跟随小编一起看看吧
    2021-08-08
  • Python数学建模学习模拟退火算法旅行商问题示例解析

    Python数学建模学习模拟退火算法旅行商问题示例解析

    模拟退火算法不仅可以解决连续函数优化问题,KIRKPATRICK在1983年成功将其应用于求解组合优化问题,现已成为求解旅行商问题的常用方法,通常采用反序、移位和交换等操作算子产生新解
    2021-10-10
  • python库Celery异步发送电子邮件定时生成报告实战示例

    python库Celery异步发送电子邮件定时生成报告实战示例

    这篇文章主要介绍了python库Celery异步发送电子邮件定时生成报告实战示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01

最新评论