形态学算法应用之连通分量提取的python实现——图像处理

原理

连通分量提取是图像处理和计算机视觉中的一项基本任务,旨在识别图像中所有连通区域,并将它们作为独立对象处理。在二值图像中,连通分量通常指的是所有连接在一起的前景像素集合。这里的“连接”可以根据四连通或八连通的邻接关系来定义。

连通分量提取的基本原理
邻接关系:

四连通:一个像素仅与其上、下、左、右四个邻域像素相连。
八连通:一个像素与其上、下、左、右以及四个对角线方向的邻域像素相连。
扫描算法:连通分量的提取通常通过扫描整个图像,对每个前景像素检查其邻域,以确定它是否属于已知的连通分量,或需要创建一个新的连通分量。这个过程可以使用两种主要技术

基于标签的扫描:在第一次扫描过程中,为图像中的每个像素分配一个临时标签,表示其所属的连通分量。如果一个像素与一个或多个已标记的像素相连,它将被赋予相同的标签。如果相连的像素属于不同的连通分量,则需要在后续处理中合并这些分量。第二次扫描中,所有属于同一连通分量的像素将被赋予一个唯一的标签。
并查集(Union-Find)算法:这是一种有效的数据结构和算法,用于跟踪元素分组的集合。在连通分量提取的过程中,它可以用来合并相交的连通分量,并快速查找某个像素所属的连通分量。
数学形态学在连通分量提取中的应用
数学形态学提供了一组用于图像处理的工具,特别是对图像进行膨胀、腐蚀、开操作和闭操作,这些都是基于结构元素的形状操作。在连通分量提取中,可以利用膨胀和腐蚀操作来改善连通分量的识别
腐蚀:可以用来去除小的噪声点,可能有助于分离在原始图像中紧密相连的对象。
膨胀:可以用来填补对象内的小孔,或将靠得很近的对象连接起来。
应用
连通分量提取广泛应用于图像分割、对象识别、目标跟踪和图像分类等领域。通过识别和标记图像中的独立对象,可以进一步对每个对象进行分析,如计算它们的大小、形状、位置等特性,这对于理解图像内容和进行高级图像分析至关重要。

python实现下图

在这里插入图片描述

提示

结果图显示了对该图提取其中一个连通分量的结果。
第一步,用阈值210对原图进行阈值操作,得到二值图像,可用函数cv2.threshold(img, 210, 1, cv2.THRESH_BINARY)实现;
第二步,指定一个连通分量的起始位置(实验中取坐标(100, 350)),构造初始阵列X_0(除了(100,350)位置置1,其余位置置0);
第三步,按照公式X_k=〖(X〗(k-1)⊕B)∩A,k=1,2,3,…更新阵列,直到X_k=X(k-1),其中B是5×5的方形结构元.最后收敛后的X_k即为上图最右显示的一个连通分量。

python代码

import cv2
import numpy as np
import matplotlib.pyplot as pltstart_position=(100,350)  #(90,400)
img = cv2.imread('Fig0918.tif', 0)
_, img_bin = cv2.threshold(img, 210, 1, cv2.THRESH_BINARY)
kernel = np.ones((5, 5), dtype=np.uint8)
img_dst = np.zeros(img.shape)
img_dst[start_position] = 1
img_last = np.zeros(img.shape)while (np.sum(img_dst-img_last) != 0):img_last = img_dstimg_dst = cv2.dilate(img_last, kernel)img_dst = np.logical_and(img_dst, img_bin)img_dst = img_dst.astype(np.float)plt.subplot(1,3,1)
plt.imshow(img,cmap='gray')
plt.axis("off")
plt.title("original")plt.subplot(1,3,2)
plt.imshow(img_bin,cmap='gray')
plt.axis("off")
plt.title("binary")
plt.subplot(1, 3, 3)
plt.imshow(img_dst, cmap='gray')
plt.axis('off')
plt.title('connected_component')plt.show()

此代码是从一个指定的起点开始,通过迭代膨胀和逻辑与操作,识别和提取与该点连通的图像区域。这种方法特别适用于分析和处理具有复杂形状或结构的图像,在图像分割、目标识别等领域有着广泛的应用。

结果展示

在这里插入图片描述

取坐标(90, 400), 可以提取出另一根骨头。

总结

连通分量的定义:令S是一个像素子集,如果S中的全部像素之间存在一个通路(m通路或8通路),则可以说两个像素p和q在S中是连通的。对于S中的任何像素p,S中连通到该像素的像素集称为S的连通分量。
应用背景:在许多自动图像分析应用中,如何识别出图像中的不同之处,往往是从其二值图像中提取连通分量。

流程:
第一步,用阈值210对原图进行阈值操作,得到二值图像,可用函数cv2.threshold(img, 210, 1, cv2.THRESH_BINARY)实现;
第二步,指定一个连通分量的起始位置(实验中取坐标(100, 350)),构造初始阵列X_0(除了(100,350)位置置1,其余位置置0);
第三步,按照公式X_k=〖(X〗(k-1)⊕B)∩A,k=1,2,3,…更新阵列,直到X_k=X(k-1),其中B是5×5的方形结构元.最后收敛后的X_k即为上图最右显示的一个连通分量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2775618.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【大厂AI课学习笔记】【1.5 AI技术领域】(9)机器翻译

今天学习的是机器翻译。 关注我,我会将全部的脑图,在本内容完结的时候,发到资源共享中。 Machine Translation,属于计算机语言学的范畴,利用计算机程序将文字或者演说从一种语言翻译成另一种语言。 使用一种基于语言…

R语言rmarkdown使用

1、安装 install.packages(rmarkdown) library(rmarkdown) install.packages(tinytex) tinytex::install_tinytex() 2、新建R Markdown 3、基本框架 红色框内为YAML:包括标题、作者和日期等 黄色框内为代码块:执行后面的代码,并可以设置展…

Git详细讲解

文章目录 一、Git相关概念二、本地分支中文件的添加 、提交2.1 文件状态2.2 创建Git仓库2.2.1 git init2.2.2 git clone 2.3 添加操作(git add)2.4 提交操作(git commit)2.5 撤销操作2.5.1 撤销 add操作2.5.2 撤销 commit操作2.5.3 覆盖上一次的commit操…

供应链领域数据中台架构建设(上)

点击下方“JavaEdge”,选择“设为星标” 第一时间关注技术干货! 关注我,紧跟本系列专栏文章,咱们下篇再续! 作者简介:魔都国企技术专家兼架构,多家大厂后端一线研发经验,各大技术社区…

【linux开发工具】vim详解

📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 “学如逆水行舟&#xff0…

【图形图像的C++ 实现 01/20】 2D 和 3D 贝塞尔曲线

目录 一、说明二、贝塞尔曲线特征三、模拟四、全部代码如下 一、说明 以下文章介绍了用 C 计算和绘制的贝塞尔曲线(2D 和 3D)。    贝塞尔曲线具有出色的数学能力来计算路径(从起点到目的地点的曲线)。曲线的形状由“控制点”决…

Airtest实现在手机界面快速批量采集数据

Airtest实现在手机界面快速批量采集数据 一、问题 Airtest使用的poco方法比较慢,寻找差不多一周,看完这篇文章能节省一周时间,希望帮到大家。 二、解决思路 使用Airtest图像识别,这样就会速度上提升效率。 三、解决办法 使用页…

【数据结构】堆(创建,调整,插入,删除,运用)

目录 堆的概念: 堆的性质: 堆的存储方式: 堆的创建 : 堆的调整: 向下调整: 向上调整: 堆的创建: 建堆的时间复杂度: 向下调整: 向上调整&#xff…

Nature Machine Intelligence 使用机器学习驱动的可拉伸智能纺织手套捕捉复杂的手部动作和物体交互

研究背景 对灵巧手运动的精确实时跟踪在人机交互、元宇宙、机器人和远程医疗等领域有着广泛的应用。当前的可穿戴设备中的大多数仅用于检测精度有限的特定手势,并且没有解决与设备的可靠性、准确性和可清洗相关的挑战。对传感器直接放置在用户的手上有严格的要求&am…

3.2 Verilog 时延

关键词:时延, 惯性时延 连续赋值延时语句中的延时,用于控制任意操作数发生变化到语句左端赋予新值之间的时间延时。 时延一般是不可综合的。 寄存器的时延也是可以控制的,这部分在时序控制里加以说明。 连续赋值时延一般可分为…

懒人精灵 之 Lua 捕获 json解析异常 ,造成的脚本停止.

Time: 2024年2月8日20:21:17 by:MemoryErHero 1 异常代码 Expected value but found T_END at character 12 异常代码 Expected value but found T_OBJ_END at character 223 处理方案 - 正确 json 示范 while true do--Expected value but found T_END at character 1--Ex…

2024-02-08 Unity 编辑器开发之编辑器拓展1 —— 自定义菜单栏与窗口

文章目录 1 特殊文件夹 Editor2 在 Unity 菜单栏中添加自定义页签3 在 Hierarchy 窗口中添加自定义页签4 在 Project 窗口中添加自定义页签5 在菜单栏的 Component 菜单添加脚本6 在 Inspector 为脚本右键添加菜单7 加入快捷键8 小结 1 特殊文件夹 Editor ​ Editor 文件夹是 …

解决用DeepL翻译文档后不能编辑问题

第一步:将原始文档另存为.xml格式。 在编辑软件中,选择“文件”-->“另存为”-->选择xml格式。如下图所示: 第二步:使用记事本打开xml文档。 在保存好的xml文档上右击,选择“打开方式”为记事本。如下图所示&a…

Flask基础学习

1.debug、host、port 模式修改 1) debug模式 默认debug模式是off,在修改代码调试过程中需要暂停重启使用,这时可修改on模式解决。 同时在debug模式开启下可看到出错信息。 下面有关于Pycharm社区版和专业版修改debug模式的区别 专业版 社区版&#…

网络编程-Socket套接字

目录 1.网络编程 1.1定义与图解 1.2基本概念 (1)发送端和接收端 (2)请求和响应 (3)客户端和服务端 2.Socket套接字 2.1定义 2.2分类 (1)流套接字 (2&#xff…

通过Demo学WPF—数据绑定(二)

准备 今天学习的Demo是Data Binding中的Linq: 创建一个空白解决方案,然后添加现有项目,选择Linq,解决方案如下所示: 查看这个Demo的效果: 开始学习这个Demo xaml部分 查看MainWindow.xaml: …

linux下的预编译、编译、汇编、连接,生成单独文件,感受编译过程

linux下的预编译、编译、汇编、连接,生成单独文件。首先需要确认系统安装了gcc编译器,输入gcc -v或者g -v,如果能看到版本号等信息就是已经存在了,如图(centos7): 然后随便vim产生一个.cpp文件&…

openGauss学习笔记-216 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-CPU

文章目录 openGauss学习笔记-216 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-CPU216.1 CPU216.2 查看CPU状况216.3 性能参数分析 openGauss学习笔记-216 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-CPU 获取openGauss节点的CPU、内存、I/O和网络资源使用情况…

《游戏引擎架构》 -- 学习2

声明,定义,以及链接规范 翻译单元 声明与定义 链接规范 C/C 内存布局 可执行映像 程序堆栈 动态分配的堆 对象的内存布局 kilobyte 和 kibibyte 流水线缓存以及优化 未完待续。。。

数学建模-灰色预测最强讲义 GM(1,1)原理及Python实现

目录 一、GM(1,1)模型预测原理 二、GM(1,1)模型预测步骤 2.1 数据的检验与处理 2.2 建立模型 2.3 检验预测值 三、案例 灰色预测应用场景:时间序列预测 灰色预测的主要特点是模型使用的…