实现halcon中的erosion、connection、fill_up

news2025/1/4 17:38:00

        在halcon中,区域R是用一系列行程(run)的集合表示的,run的形式为(Row,ColumnBegin,ColumnEnd),分别对应行坐标、列开始坐标、列结束坐标,这种保存区域的方法被称作行程表示法或行程编码。因为图像数据是按行保存的,所以使用水平行程,行程 (r_i,cb_i,ce_i) 在R内的存储顺序定义为: r_i<r_j\vee r_i=r_j \wedge cb_i<cb_j \vee r_i=r_j\wedge cb_i=cb_j\wedge ce_i<ce_j 。用行程编码法可以减少存储空间,避免区域外像素的检查,还可以显著提升算法的速度。

一个区域的行程编码

        形态学的处理需要涉及两个区域,一个是想处理的区域,用R表示,一个是能够描述感兴趣形状的区域,也被称作结构元,用S表示,结构元有时需要指定参考点。在halcon中膨胀被定义为取出S中的每个点s,根据s所对应的向量来平移R,然后对全部平移得到的区域取并集。假设我们使用一个3×3的矩形结构元,参考点为矩形中心,如下图,红色圆圈所在位置为参考点,结构元一共有9个元素,意味着需要8次平移,剩下的一次对应原区域R(平移向量=0向量),实际处理中,我们可以将R向上平移一次、向下平移一次加上R得到三个区域,再将三个区域分别向左和向右平移,由于行程编码是水平的,对行程的左右移动只需要将行程的列开始坐标减去最大平移量、列结束坐标加上最大平移量即可实现,这可以极大的提升算法速度。

3×3矩形结构元

        halcon中的腐蚀被定义为将结构元S在平面内移动,如果S被完全包含在R中,就将其参考点所在位置加入到输出结果中。即结构元S在R中“逛荡”,每“逛荡”一下,就记下S参考点的位置,直到“逛荡”完所有位置。从上面的定义不难看出,腐蚀不仅可以收缩区域,将彼此相连的物体分开,还可以实现类似模板匹配的功能。下图展示了膨胀和腐蚀的过程,膨胀使用矩形结构元,腐蚀使用十字结构元,腐蚀的结果只有两个像素,它们正是完全匹配十字的位置。膨胀和腐蚀还有一个有趣的属性,在进行补集操作时,它们彼此之间是互为对偶的,对前景的一个膨胀处理等同于对背景的一个腐蚀处理,对前景的一个腐蚀处理等同于对背景的一个膨胀处理,所以膨胀和腐蚀只需要实现其中的一个就可以了,另一个通过对偶性即可得到。

膨胀

腐蚀

        连通区域是一组像素点的集合,集合中所有点都彼此连通。两个像素的连通性有两种定义:

        4连通:一个像素在另一个像素的上方,下方,左侧或右侧。

        8连通:一个像素在另一个像素的上方,下方,左侧,右侧,左上方,左下方,右上方或右下方。

        连通区域分析是指将一个区域分割为彼此互相独立的连通区域,在halcon中由connection算子实现。

        需要注意的是,对前景和背景要使用不同的连通性定义。如果8连通描述前景、则4连通描述背景,如果4连通描述前景、则8连通描述背景。

        由于区域由行程编码表示,连通区域的计算相对简单,按从上到下顺序扫描每一行,按从左到右顺序扫描当前行所有run,将当前run与上一行的run进行比较,如果与上一行的run都不连通,标记为新的区域,如果当前run未标记并与上一行的某个run连通,则将当前run标记为与连通run相同的label,否则将两个run的label进行合并。算法的开始需要声明一个树结构(一维数组),在合并两个run时,寻找label的根部,插入等价关系,直至整个算法结束。具体的计算过程请看下图,图中的白色区域即为要计算的区域,一共有11个run,分别在它们的左上角用红色记号标出,从第一个run所在的行开始扫描,由于上一行没有任何run,当前行的4个run被分别标记为1,2,3,4(洋红色标出),继续扫描下一行,从第五个run开始,第五个run与第一个run连通,所以标记为1,继续下一个run(第六个),第六个run先与第二个run连通,首先标记为2,而后又与第三个run连接,由于已经被标记过,所以需要合并,此时2小于3,添加关系2<-3(3指向2),并将第三个run的标记改为2,继续下一个run(第七个),与第三个run连接(注意,此时第三个run的label已修改为2),标记为2,继续下一个run,第八个run标记为4,继续扫描下一行,第九个run标记为1,第十个run先与第七个run连接,标记为2,后与第八个run连接,需要合并,添加关系2<-4,修改第八个run的label为2,扫描最后一行,第十一个run先与第九个run连接,标记为1,后与第十个run连接,所以要合并,添加关系1<-2,修改第十个run的label为1。此时区域内的所有像素都被标记好了,同时我们还有(2<-3)(2<-4)(1<-2)这样的对应关系,不难得到这个区域实际是一个独立的区域。

连通区域分析示意图

        有了上面的知识之后,实现halcon中的fill_up(填充区域内的孔洞)就不难了,我们看下面的图,红色区域R为二值化所得,我们的目标是对R进行孔洞填充。很自然的,R的孔洞必然在R的补集中,所以求出R的最小外接矩形Rect(平行于坐标轴),用Rect减去R就得到了R的补集R’,由于孔洞是彼此独立的,这时对R’进行连通区域分析,得到很多个区域{R1,R2,R3,R4..……},显然并不是每个区域都是孔洞,那怎么判断呢?也很简单,只要这个区域与Rect连通,那这个区域就不是孔洞,怎么判断与Rect是否连通呢?直接用两个区域的外接矩形是否有重合的边就够了,是不是很简单?有一点需要注意的是,在计算R’的连通区域时,应该使用4连通。

目标区域

R补集的连通区域计算

填充之后的区域

        目前connection、fill_up已经加入到测试demo中,connection会同时计算区域的area、row1、column1、row2、column2、circularity、ra、rb、phi、rect2_phi、rect2_len1、rect2_len2等属性,性能接近halcon,欢迎大家测试。

connection

fill_up

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

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

相关文章

C#中重写tospring方法

在C#中&#xff0c;重写ToString方法允许你自定义对象的字符串表示形式。当你想要打印对象或者在调试时查看对象的状态时&#xff0c;重写ToString方法非常有用。 默认情况下&#xff0c;ToString方法返回对象的类型名称。通过重写这个方法&#xff0c;你可以返回一个更有意义…

1.5 队列概念,应用及部分实现

1.基本概念 队列&#xff08; Queue &#xff09;&#xff1a;也是运算受限的线性表。是一种先进先出&#xff08; First In First Out &#xff0c;简称 FIFO &#xff09;的线性表。只允许在表的一端进行插入&#xff0c;而在另一端进行删除。 队首&#xff08; front &am…

C/C++编程-算法学习-数字滤波器

数字滤波器 一阶低通滤波器结论推导11. 基本公式推导2. 截止频率 和 采样频率 推导 实现 二阶低通滤波器实现1实现2推导1推导2 一阶低通滤波器 结论 其基本原理基于以下公式&#xff1a; o u t p u t [ n ] α ∗ i n p u t [ n ] ( 1 − α ) ∗ o u t p u t [ n − 1 ] …

(Arxiv-2023)MobileDiffusion:移动设备上即时文本到图像生成

MobileDiffusion&#xff1a;移动设备上即时文本到图像生成 Paper Title&#xff1a;MobileDiffusion: Instant Text-to-Image Generation on Mobile Devices Paper是谷歌出品 Paper地址 图 1&#xff1a;MobileDiffusion 用于 (a) 文本到图像的生成。(b) Canny 边缘到图像、风…

认证授权概述和SpringSecurity安全框架快速入门

1. 认证授权的概述 1.1 什么是认证 进入移动互联网时代&#xff0c;大家每天都在刷手机&#xff0c;常用的软件有微信、支付宝、头条、抖音等 以微信为例说明认证的相关基本概念。在初次使用微信前需要注册成为微信用户&#xff0c;然后输入账号和密码即可登录微信&#xff0c…

完成stable将图片转换为二维码

1.创建虚拟环境 conda create -n stable python=3.10.6 2.克隆项目 git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui 或者 git clone https://kgithub.com/AUTOMATIC1111/stable-diffusion-webui 3.安装依赖(-i https://pypi.tuna.tsinghua.edu.cn/s…

C++基础编程100题-028 OpenJudge-1.4-08 判断一个数能否同时被3和5整除

更多资源请关注纽扣编程微信公众号 http://noi.openjudge.cn/ch0104/08/ 描述 判断一个数n 能否同时被3和5整除 输入 输入一行&#xff0c;包含一个整数n。&#xff08; -1,000,000 < n < 1,000,000&#xff09; 输出 输出一行&#xff0c;如果能同时被3和5整除输…

八股文-基础知识-int和Integer有什么区别?

引言 在Java编程实践中&#xff0c;基本数据类型int与包装类Integer扮演着不可或缺的角色&#xff0c;它们间的转换与使用策略深刻影响着程序的性能与内存效率。本文旨在深入探究int与Integer的区别&#xff0c;涵盖其在内存占用、线程安全、自动装箱与拆箱机制等方面的表现。…

3条非常实用的处世“潜规则”,受益终生

01 尽量不要让别人在你身上免费得到&#xff0c;哪怕是你不需要或者根本不在意的东西。 让别人免费得到&#xff0c;其实就是一种暗示&#xff0c;暗示别人可以继续免费索取&#xff0c;为什么&#xff1f;因为人性总是趋利的&#xff0c;如果可以免费得到&#xff0c;那为什…

高校是需要AIGC 实验室还是大数据人工智能实验室呢

AIGC&#xff08;人工智能与图形计算&#xff09;实验室和大数据人工智能实验室虽然都隶属于人工智能的范畴&#xff0c;但它们的关注点、研究方向和具体应用领域有所不同。 我们分别从研发方向、技术侧重、应用领域、研究工具和方法等方面去分析两者的区别&#xff0c;希…

MySQL的跳跃式索引

Skip Index Scan&#xff08;跳跃式索引&#xff09; 例如初中有个学生表&#xff0c;年级、班级、学号 符合索引。 -- 问题是下面这个查询为什么也可以用到索引。 select * from 初中学生表 where 班级 1 and 学号 001-- 思考一下这个查询比全表扫描快吗&#xff1f; sele…

“微软蓝屏”事件:网络安全与稳定性的深刻反思

&#x1f308;所属专栏&#xff1a;【其它】✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的点…

软件-vscode-plantUML-IDEA

文章目录 vscode基础命令 实操1. vscode实现springboot项目搭建 &#xff08;包括spring data jpa和sqlLite连接&#xff09; PlantUMLIDEA下载及安装Eval Reset插件配置修改IDEA创建项目的默认目录IDEA配置gitIDEA翻译插件translationIDEA断点调试IDEA全局搜索快捷键不能使用代…

UE5.4内容示例(3)FBX_Import_Options - 学习笔记

https://www.unrealengine.com/marketplace/zh-CN/product/content-examples 《内容示例》是学习UE5的基础示例&#xff0c;可以用此熟悉一遍UE5的功能 FBX_Import_Options案例 导入案例需要和模型制作工具结合理解&#xff0c;这里就大致了解下都可以导入些什么内容 1.1 Stati…

基于web3区块链的名酒资产数字化、个人闲置资产收藏系统,实现联盟链、NFT数据上链、智能合约开发

系统背景&#xff1a; 国内有众多历史悠久却极具收藏价值的名酒品类&#xff0c;但是传统名酒投资存在着保真、流通和收藏三大痛点&#xff0c;极大影响了名酒产业的发展。基于区块链的分布式、不可篡改、可追溯、透明性、多方维护、交叉验证等特性&#xff0c;数据权属可以被有…

录歌用什么软件好?关于录音软件的操作介绍(内含7款)

录歌用什么软件好&#xff1f;借助录音软件&#xff0c;我们可以在电脑上录制音频文件&#xff0c;包括游戏原声、电台、视频会议、音乐平台等。 一、什么是录音软件 简单来说&#xff0c;录音软件就是一个录制声音的用户界面。这些应用程序允许用户录制任何声音、处理和混合音…

成就巴西休闲游戏如何借助Google谷歌广告投放优势

在探讨巴西休闲游戏如何借助谷歌广告投放优势实现市场扩张的过程中&#xff0c;我们不得不深入分析巴西市场的独特属性、休闲游戏的兴起背景&#xff0c;以及谷歌广告平台在全球范围内的强大影响力。近年来&#xff0c;随着移动游戏市场的快速发展&#xff0c;特别是中轻度休闲…

使用免费代理有什么危险?

一、引言 随着互联网的普及&#xff0c;越来越多的人开始意识到代理服务的重要性&#xff0c;尤其是在保护隐私和突破地域限制方面。然而&#xff0c;在众多的代理服务中&#xff0c;免费的代理服务已经成为许多人的首选。本文将深入探讨使用免费代理的危险&#xff0c;并帮助…

LeetCode Hot100 删除链表的倒数第 N 个结点

给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[]示例 3&#xff1a;…

【Unity渲染】烘培

光照探针 光照探针就是在烘焙的时候会布局多个探测点&#xff0c;记录那个地方的光照信息&#xff0c;后面实时渲染动态物体会影响其渲染&#xff0c;动态物体会选择自己周围最近的探针进行影响 反射探针 反射探针就是记录周围环境&#xff0c;计算一个类似天空盒的图片&am…