Halcon 边缘提取(亚像素)

news2024/12/23 16:07:38

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 1
    sinPhi := 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.coloradmin.cn/o/1970647.html

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

相关文章

这些天,有多少人去电影院看巴黎奥运会?

近期,巴黎奥运会的赛况频频登上热搜,中国奥运健儿们的奋勇拼搏令人热血沸腾。而许多观众,或由于租房情况不便于用投影仪观赏比赛,或由于期待更佳的观赛体验,因此有不少人去电影院观赛。由于实时数据的更新性和统计的复…

[Bugku] web-CTF靶场-计算器

计算器 1.开启环境 理论上来说题目最多只能填0-9的答案,如果需要填大于9的需要修改maxlength参数 得出flag

「码」上行动 一物一码+TPM让“多进货多卖货”不再是口号

“门店进货量翻倍,一些门店一个月连续补货3次!”在与纷享销客产品经理的电话交流中,X饮品企业的张总难掩喜悦之情。 他兴奋地表示,在北方城市推出的基于一物一码的门店进销双激励码营销试点取得了显著成果,所有参与试…

开放原子校源行 | 武汉大学师生一行走进麒麟信安,开展社会实践交流活动

“开放原子校源行”是开放原子开源基金会作为国家级开源公益平台发起的长期性开源教育推广公益项目。项目拟通过资助高校设立开源社团、推广开源课程、设置开源助学金、引导开源实践等方式培育开源人才,加快将开源文化、理念和技术融入校园,引导广大师生…

CST软件如何实现S-parameter随其他参数变化的1D曲线

本期的FAQ更新一个非常高频的问题,如何实现S-parameter随其他参数变化的1D曲线。有的时候也不一定是S参数,可能是用户关心的阻抗结果,也可能是VSWR等。 在老版本的时候,CST软件有个后处理的宏可以很容易的将某一频点下的0D转换成…

引领未来交通新纪元:综合智慧监管平台

引领未来交通新纪元:综合智慧监管平台 在21世纪的今天,随着科技的飞速发展,交通运输行业作为国民经济的命脉,正经历着前所未有的变革与挑战。面对日益增长的运输需求、复杂多变的交通环境以及公众对安全、高效、绿色出行的迫切期…

AcWingTrie树

字典树的应用背景: 看以下几个题: 1、给出n个单词和m个询问,每次询问一个单词,回答这个单词是否在单词表中出现过 答:简单!map,短小精悍。 好。下一个 每次询问一个前缀,回答询问是多少个单词的前缀。2、给出n个单词和…

硬核!288页Python核心知识笔记(附思维导图,建议收藏)

不少朋友在学习Python时,都会做大量的笔记,随着学习进度的增加,笔记越来越厚,但有效内容反而越来越少。 今天就给大家分享一份288页Python核心知识笔记,相较于部分朋友乱糟糟的笔记,这份笔记更够系统地总结…

软件项目管理工具排行榜:国内外优劣对比

项目管理工具对项目开发的重要性不言而喻,通过对比业内对各个项目管理工具的认可度,筛选出人们公认的软件项目管理工具排行榜,具体详细如下: 1、Microsoft Project 简介:Microsoft Project是一款强大的基于云的项目管理…

【数据结构】包装类和泛型

🎉欢迎大家收看,请多多支持🌹 🥰关注小哇,和我一起成长🚀个人主页🚀 ⭐在更专栏Java ⭐数据结构 ⭐已更专栏有C语言、计算机网络⭐ 👑目录 包装类🌙 ⭐基本类型对应的包…

4款一眼万年的精品软件,免费又好用,可惜很多人不知道

各位Windows用户,有没有觉得自带的播放器不太好用?曾经用过暴风影音、QQ影音、迅雷看看和快*等等国产播放器的大佬们,估计小孩都上小学了吧。 PotPlayer 这款PotPlayer视频播放器,它占用空间小,功能丰富强大&#xf…

【Qt】为什么Qt是你选择的理由?

目录 客户端 图形化界面 Windows环境下可以开发GUI的方案 Qt介绍 Qt的发展史 Qt所支持的平台 Qt版本 Qt的优点 Qt的应用场景 Qt的行业发展方向 Qt的发展前景 使用Qt的成功案例 一般来说,计算机的岗位有四种,分别是: 后端前端测试…

Golang通用代码生成器:仙童 电音仙女尝鲜版八,从MySQL8自动反射生成项目

Golang通用代码生成器:仙童 电音仙女尝鲜版八,从MySQL8自动反射生成项目 Golang通用代码生成器仙童,电音仙女尝鲜版八,此版本增强修复了数据库自动反射功能。更新修复了前端代码生成器无登录模块时的错误。修复了多对多候选的缺陷…

乐鑫原厂ESP32-S3模块ESP32-S3-WROOM-1区别与比较

乐鑫原厂ESP32-S3对外发售的模块,公开的有3类5种,分别是: 1,ESP32-S3-WROOM-1 模组 2,ESP32-S3-WROOM-1U 模组 3,ESP32-S3-WROOM-2 模组 4,ESP32-S3-MINI-1 模组 5,ESP32-S3-MINI-1…

Java对象流

对象流 对象输入流 java.io.ObjectInputStream使用对象流可以进行对象反序列化 构造器 ObjectInputStream(InputStream in) 将当前创建的对象输入流链接在指定的输入流上 方法 Object readObject() 进行对象反序列化并返回。该方法会从当前对象输入流链接的流中读取若干…

Python写UI自动化--playwright(在UI元素上悬停)

要在UI元素上执行鼠标悬停(hover)动作,可以使用page.hover()方法。这个方法使鼠标指针移动到指定的元素上,就像用户将鼠标悬停在该元素上一样。这对于触发那些依赖于鼠标悬停事件的行为(如显示下拉菜单、提示框或其他动…

【数据结构】哈希表(散列表)

介绍 哈希表(也叫散列表),是根据关键码值( Key value )而直接进行访问的数据结构,也就是说,它通过把关键码值映射到表中的一个位置来访问记录,以加快查找的速度。这个映射函数叫做散…

“您的连接不是私密连接”怎么解决?

遇到“您的连接不是私密连接”的警告时,这通常意味着浏览器无法与网站建立安全的加密连接,可能是因为网站的SSL证书存在问题或网络连接存在安全风险。 1、清除浏览器缓存和Cookies:清除浏览器缓存和Cookies有时可以解决这个问题,因…

在Qt中获取Windows中进程的PID

主要是用到了系统自带的工具【tasklist.exe】 利用 QProcess调用这个tasklist有一点坑&#xff0c;已经在代码中指出了。 指定为csv格式输出的话&#xff0c;在后处理时比较方便。 QList<quint64> listProcessIdentifier(QString processName) {QProcess process;QStrin…

华为OD应聘最全流程!!!

第一步&#xff1a;投递简历 提供姓名、邮箱、手机号、身份证号&#xff0c;务必慎重考虑&#xff0c;因为此后会被锁定在特定项目组。&#x1f4dd;&#x1f512; 这一步在招聘站点搜索一下即可&#xff0c;主要选择目标城市和岗位&#xff0c;一般投递之后就会有 HR 联系&…