Halcon 边缘提取(亚像素)

Halcon提供多种边缘提取算法。像素提取方法有常用的边缘提取算子或深度学习分割模型等。考虑到精度问题可能需要提取亚像素边缘。当然也可以提取轮廓:线、圆、椭圆等。本文只讨论提取轮廓。
在这里插入图片描述

1 基本概念

正常情况下,无需特殊操作即可提取边缘轮廓。

1.1 获取图像

获取图像。

1.2 提取轮廓或线

Halcon提供各种亚像素级轮廓提取算子。通常标准算子基于一阶导数。它将获取图像并返回XLD轮廓。当使用二阶导数时,必须使用拉普拉斯算子,然后才能够提取沿零点相交的高等线。不仅可用灰度值方法提取,还可以根据颜色提取边缘。
除了提取边缘,Halcon 还提供了提取线段的算子。与边缘相反,一条线由两个灰度值过渡组成。因此,可将一条线看做事平行的边。

1.3 一个简单的例子

下面程序中结束边缘提取的基本概念。提取边缘轮廓的算子edges_sub_pix,该算子将返回XLD轮廓。参数选择“lanser2”,使用中等大小的平滑蒙版。参数Low的地址确保即使低对比度的也可提取轮廓 。为显示多个轮廓,选择12-color颜色模式。

read_image(Image,'mreut4_3')
edges_sub_pix(Image,Edges,'lanser2',0.5,8,50)
dev_set_colored(12)
dev_clear_window()
dev_display(Edges)

在这里插入图片描述

2 扩展概念

2.1 图像校正

为实现高精度提取边缘或线条,相机应具有线性响应函数,即图像中的灰度值与入职能量呈线性关系。考虑到有些相机没有线性响应功能,Halcon提供所谓的辐射校准,通过操作符radiometric_self_calibration,可以确定相机逆响应函数,然后再执行编译或线条提取之前使用lut_trans将此函数应用于图像中。

2.2 感兴趣区域

使用感兴趣区域可加快边缘提取速度,鲁棒性好。

2.3 提取变换或线条

边缘轮廓提取最常用的算子edges_sub_pix。通过使用filter参数指定相应的名称,可以选择各种过滤方法。通常情况,‘canny’(基于高斯卷积)或’lanser2’。‘lanser2’的优点是递归实现,当平滑值在增大会增加执行时间。如果图像没有收到噪声或图像模糊,可考虑使用’sobel_fast’。算子zero_crossing_sub_pix可以结合拉普拉斯算子使用。通常情况拉普拉斯算子主要应用于医学领域。考虑到在彩色图像中提取边缘,可使用算子edges_color_sub_pix。类似的,图像没有噪声或模糊,参数建议使用’sobel_fast’进行快速边缘提取。
提取线最常用的运算符是lines_gauss。与lines_facet相比,它更灵活。提取线条宽度由参数指定:Sigma。如果需要线条宽,可以使用算子zoom_image_factor缩小图像,减少执行时间。对于彩色线条可使用算子lines_color。

2.4 轮廓属性

提取边缘或线不仅提供XLD轮廓,还提供属性。属性是数值,它们要么与轮廓的每个控制点相关联(称为轮廓属性),要么与每个轮廓作为一个整体相关性(全局轮廓属性)。可以通过算子get_contour_attrib_xld和get_contour_global_attrib_xld指定属性名称。

属性值以数字元祖的形式返回。典型的边缘属性如振幅和方向。对于行,典型的属性是行宽度。可以使用query_contour_attribs_xld和query_contour_global_attribs_xld查询给定轮廓的可以属性。

2.5 处理XLD轮廓

通常,仅通过提供轮廓和访问属性并不能完成任务。Halcon提供轮廓分割、特征提取等。

2.6 将结果转换为世界坐标系

在需要利用中,等高线的坐标需要转换为另一种坐标系。校正系统中,算子contour_to_world_plane_xld算子轻松转换,同时可以消除镜头和透视变换的畸变。

2.7 可视化结果

将处理结果显示在图像上。

3 程序示例:

* rim_simple.hdev: measures the diameter of drill-holes
* 
dev_update_off ()
* ****
* step: acquire image
* ****
read_image (Image, 'rim')
get_image_size (Image, Width, Height)
dev_open_window_fit_image (Image, 0, 0, Width, Height, WindowID)
set_display_font (WindowID, 14, 'mono', 'true', 'false')
* ****
* step: determine region of interest (ROI)
* ****
threshold (Image, Dark, 0, 128)
connection (Dark, DarkRegions)
select_shape (DarkRegions, Circles, ['circularity', 'area'], 'and', [0.85, 50], [1.0, 99999])
boundary (Circles, RegionBorder, 'inner')
dilation_circle (RegionBorder, RegionDilation, 6.5)
union1 (RegionDilation, ROIEdges)
dev_display (Image)
dev_set_color ('yellow')
dev_set_draw ('margin')
dev_display (ROIEdges)
disp_continue_message (WindowID, 'black', 'true')
stop ()
* ****
* step: extract edges
* ****
reduce_domain (Image, ROIEdges, ImageROI)
edges_sub_pix (ImageROI, Edges, 'lanser2', 0.3, 10, 30)
sort_contours_xld (Edges, SortedContours, 'upper_left', 'true', 'row')
dev_display (Image)
colored_display (SortedContours, ['cyan', 'white'])
disp_continue_message (WindowID, 'black', 'true')
stop ()
* ****
* step: process contours
* ****
fit_ellipse_contour_xld (Edges, 'ftukey', -1, 2, 0, 200, 3, 2, Row, Column, Phi, Ra, Rb, StartPhi, EndPhi, PointOrder)
NumHoles := |Ra|
gen_ellipse_contour_xld (ContEllipse, Row, Column, Phi, Ra, Rb, gen_tuple_const(NumHoles,0), gen_tuple_const(NumHoles,rad(360)), gen_tuple_const(NumHoles,'positive'), 1)
dev_display (Image)
sort_contours_xld (ContEllipse, SortedContEllipse, 'upper_left', 'true', 'row')
colored_display (SortedContEllipse, ['cyan', 'white'])
dev_set_color ('yellow')
for i := 0 to NumHoles - 1 by 1sinPhi := sin(Phi[i])cosPhi := cos(Phi[i])disp_arrow (WindowID, Row[i], Column[i], Row[i] - sinPhi * Ra[i], Column[i] + cosPhi * Ra[i], 1)disp_arrow (WindowID, Row[i], Column[i], Row[i] - cosPhi * Rb[i], Column[i] - sinPhi * Rb[i], 1)disp_arrow (WindowID, Row[i], Column[i], Row[i] + sinPhi * Ra[i], Column[i] - cosPhi * Ra[i], 1)disp_arrow (WindowID, Row[i], Column[i], Row[i] + cosPhi * Rb[i], Column[i] + sinPhi * Rb[i], 1)set_tposition (WindowID, Row[i] - Rb[i] - 50, Column[i] - 85)write_string (WindowID, 'D1=' + 2 * Ra[i])set_tposition (WindowID, Row[i] - Rb[i] - 30, Column[i] - 85)write_string (WindowID, 'D2=' + 2 * Rb[i])
endfor

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux-4:Shell编程——基础语法(50%-100%)

目录 前言 一、数组 1.数组定义 2.关联数组 3.数组长度 二、运算符 1.算术运算符 2.关系运算符 3.布尔运算符 4.逻辑运算符 5.字符串运算符 6.文件测试运算符 三、read命令 1.接收用户输入 2.开启转义 3. -p 输入提示 4. -s 静默模式 -t 设置超时时间 5.读取…

Fiddler学习笔记

目录 前言 简介 原理 界面 前言 测试可以使用fiddler工具,通过抓包的方式修改前端参数和模拟后端返回,快速定位缺陷。 简介 Fiddler是HTTP协议调试代理工具,可以记录并检查所有客户端和服务器之间的HTTP和HTTPS请求,允许监视…

算法训练1

01背包问题 背包状态方程----动态规划 二维dp 使用 f[i][j] max(f[i-1][j] ,f[i-1][j - w[i]] v[i]); 伪代码: int dp[100][100]; void test6() {int n; //装备数量int m; //背包容量int v[105], w[105]; //前面空间,后面价值for (int i 1; i &l…

ONLYOFFICE文档:为企业和开发者带来强大的文档编辑功能

本文给大家介绍一个开源项目:ONLYOFFICE文档,它能够为文档编辑、多人协作提供强大支持。无论你是个人使用,还是企业、商业开发,都能找到适合你的版本。 关于 ONLYOFFICE 文档 ONLYOFFICE 文档是一套功能强大的文档编辑器&#x…

微信小程序获取AppSecret的步骤

文章目录 微信小程序获取AppSecret的步骤:注意: 微信公众平台 小程序的密钥(或称为AppSecret)是用于加密解密、验证服务器身份等安全操作的敏感信息。不同的平台(如微信小程序、支付宝小程序、百度智能小程序等&am…

vulhub:Apache解析漏洞apache_parsing

在Apache1.x/2.x中Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。如 1.php.xxxxx 漏洞原理 Apache HTTPD 支持一个文件拥有多个后缀,并为不同后缀执行不同的指令。比如如下配置文件 AddType te…

【C#】.net core 6.0 webapi 使用core版本的NPOI的Excel读取数据以及保存数据

欢迎来到《小5讲堂》 这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 背景读取并保存NPOI信息NPOI 插件介绍基本功能示例代码写入 Excel 文件…

算法小白的进阶之路(力扣1~5)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

花几千上万学习Java,真没必要!(三十九)

1、BufferedReader的使用: 测试代码: package test.com; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class FileReadToList { pu…

使用 openai 和 langchain 调用自定义工具完成提问需求

我们提供了一个函数,接受传入运算的字符串,返回运算的结果。 现在的需求是,我们问 gpt 模型,由于模型计算能力并不好,他要调用计算函数,根据计算结果,回答我们的问题。 使用 openai 实现&#…

发布NPM包详细流程

制作 首先需要制作一个npm包。 按照以下步骤依次执行。 mkdir my-npm-package cd my-npm-package npm init 相信这一步不需要过多的解释,就是创建了一个文件夹,然后初始化了一下文件夹。 然后在生成的package.json文件夹中更改一下自己的配置&…

优化冗余代码:提升前端项目开发效率的实用方法

目录 前言代码复用与组件化模块化开发与代码分割工具辅助与自动化结束语 前言 在前端开发中,我们常常会遇到代码冗余的问题,这不仅增加了代码量,还影响了项目的可维护性和开发效率。还有就是有时候会接到紧急业务需求,要求立马完…

这两个大龄程序员,打算搞垮一个世界软件巨头!

大家都知道,Adobe是多媒体和数字内容创作者的绝对王者,它的旗下有众多大家耳熟能详的软件:Photoshop、Illustrator、Premiere Pro、After Effects、InDegign、Acrobat、Animate等等。 这些软件使用门槛很高,价格昂贵,安…

遗传算法与深度学习实战——生命模拟及其应用

遗传算法与深度学习实战——生命模拟及其应用 0. 前言1. 康威生命游戏1.1 康威生命游戏的规则1.2 实现康威生命游戏1.3 空间生命和智能体模拟 2. 实现生命模拟3. 生命模拟应用小结系列链接 0. 前言 生命模拟是进化计算的一个特定子集,模拟了自然界中所观察到的自然…

大模型之多模态大模型技术

本文作为大模型综述第三篇,介绍语言大模型多模态技术。 不同于语言大模型只对文本进行处理,多模态大模型将文本、语音、图像、视频等多模态数据联合起来进行学习。多模态大模型融合了多种感知途径与表达形态, 能够同时处理和理解来自不同感知通道(例如视觉、听觉、语言和触…

麒麟系统查看和修改ip

查看ip ifconfig ifconfig enp0s3 192.168.1.110

使用Echarts来实现数据可视化

目录 一.什么是ECharts? 二.如何使用Springboot来从后端给Echarts返回响应的数据? eg:折线图: ①Controller层: ②service层: 一.什么是ECharts? ECharts是一款基于JavaScript的数据可视化图标库,提供直观&…

javaScript中的对象

创建 this指向 命名规则 不符合变量名的命名规则和规范使用数组关联语法获取 遍历对象 使用for(var key in 对象) 删除属性 对象引用关系

Flutter大型项目架构:私有组件包管理

随着项目功能模块越来越多,怎么去管理这些私有组件包是一个不得不面对的问题,特别对于团队开发来讲,一些通用的公共组件往往会在多个项目间使用,多的有几十个,每个组件包都有有自己的版本,组件包之间还有依…

一篇文章带你入门爬虫并编写自己的第一个爬虫程序

一、引言 目前我们处在一个信息快速迭代更新的时代,海量的数据以大爆炸的形式出现在网络之中,相比起过去那个通过广播无线电、书籍报刊等传统媒介获取信息的方式,我们现在通过网络使用搜索引擎几乎可以获得任何我们需要的信息资源。 但与此同…