Halcon 边缘提取(像素)

news2024/11/24 15:48:45

传统提取边缘的方法即通过图像中的明暗进行过滤,其左右就是根据明暗区域找到像素边界。从数学角度,滤波器决定图像剃度,该图像剃度通常作为边缘幅度和边缘方法返回。通过选取所有边缘幅值高的像素点,可以提取区域间的轮廓。另一个提取边缘的方法是通过训练深度学习模型来寻找边缘。
在这里插入图片描述

1 使用边缘滤波器提取边缘

Halcon提供标准的边缘过滤器,如Sobel, Roberts, Robinson等滤波器。除此之外,还提供后期处理的算子,如果根据阈值进行提取。

2 基本概念

边缘滤波器由以下几步构成:
在这里插入图片描述

2.1 获取图像

读取图像

2.2 图像滤器

边缘滤波器获取图像后,边缘幅度是以图像字节形式存储,每个像素的灰度值代表局部边缘幅度,返回边缘方向,这些边缘方向的值是1~179表示角的度数除以2。

2.3 提取边缘

边缘滤波器的结果包含边缘幅度的图像。从该图像中,通过使用阈值算子选择具有给定最小边缘幅度的像素来提取边缘,形成的边缘通过就一个像素宽度。

2.4 一个示例

设计一个边缘滤波器,sobel_amp被应用于"thin_sum_abs"模式,以获得一个3x3的过滤器获取边缘。然后,使用算子阈值提取边缘幅度大于20的所有像素,得到的区域包含像素宽区域。

read_image(Image,'fuse')
sobel_amp(Image,EdgeAmplitude,'thin_sum_abs',3)
threshold(EdgeAmplitude,Region,20,255)
skeleton(Region,Skeleton)

在这里插入图片描述

3 扩展概念

3.1 获取感兴趣区域

感兴趣区域可以加快边缘提取,提取速度快,鲁棒性优越。

3.2 图像滤波

Halcon提供许多滤波器,最常用的滤波器是索贝尔滤波器。对应操作算子sobel_amp和sobel_dir。
最好的滤波器edges_image,这个滤波器可精细提取边缘,如果图像没噪点,可使用“sobel_fast”模式进行使用。

3.3 提取边缘

最简单的方法是从图像边缘复制中过滤像素点,此过程包含边缘点的区域。根据此区域可以提取一个像素的宽度。算子hysteresis_threshold可以消除不重要的边缘。提取边缘轮廓钱调用算子nonmax_suppression_dir,能生成更精确的边缘。
相比之下,滤波器edges_image包括抑制过滤阈值,可以简单的提前一个像素宽的边缘。
如果只需要边缘点作为一个区域,可以使用算子inspect_shape_model。此算子包含边缘滤波,过滤阈值,效率高。

3.4 边缘处理

如果想获取边缘的坐标,使用算子split_skeleton_lines是不错的选择。这个算子必须和连通域配合使用,返回线段的所有点。当然也可以使用霍夫变换获取线段。hough_lines_dir和hough_lines也可以使用。还可以使用算子gen_contours_skeleton_xld将边缘区域转换为XLD轮廓。
可以使用算子background_seg轻松提取边缘区域。如果该区域存在间隙,则可以先使用close_edges或close_edges_length算子关闭间隙。作为一种替代方法,可以使用形态学算子如opening_circle应用与background_seg输出区域。

3.5 可视化结果

将结果先说出来如边缘区域或分割的线段。

3.6 程序示例

* 提取边缘
dev_update_off()
dev_close_window()

* step:获取图像
read_image(Image,'D:/Halcon_Study/farm.jpg')
rgb1_to_gray(Image,Image)
get_image_size(Image,Width, Height)
dev_open_window_fit_image(Image,0,0,Width,Height,WindowHandle)
set_display_font(WindowHandle,16, 'mono', 'true', 'false')
dev_set_draw('margin')
dev_set_line_width(3)
dev_display(Image)
disp_continue_message(WindowHandle, 'black', 'true')
stop()

* step:图像过滤
edges_image(Image,ImaAmp,ImaDir,'lanser2',0.1,'nms',1,80)
dev_display(ImaAmp)
disp_continue_message(WindowHandle, 'black', 'true')
stop()

* step:提取边缘
threshold(ImaAmp,Region,1,255)
connection(Region,ConnectedRegions)
dev_clear_window()
dev_set_colored(12)
dev_display(ConnectedRegions)
disp_continue_message(WindowHandle, 'black', 'true')
stop()

* step:边缘处理
dev_clear_window()
count_obj(ConnectedRegions,Number)
gen_empty_obj(XLDContours)
for i:=1 to Number by 1
    select_obj(ConnectedRegions,SingleEdgeObject,i)
    split_skeleton_lines(SingleEdgeObject,2,BeginRow,BeginCol,EndRow,EndCol)
    for k:=0 to |BeginRow|-1 by 1
        gen_contour_polygon_xld(Contour,[BeginRow[k],EndRow[k]],[BeginCol[k],EndCol[k]])
        concat_obj(XLDContours,Contour,XLDContours)
    endfor
endfor
dev_display(XLDContours)

在这里插入图片描述
在这里插入图片描述

4 深度学习提取边缘

深度学习的边缘提取其实质是深度学习的语义分割。该模型设计提取边缘训练模型。该模型适应性强,可以在分割模型上再进行训练。

4.1 概念

基于深度学习的边缘提取与其他深度学习语义分割相似。
Halcon提供了特定的模型设计和训练以提取边缘。但是,并不能够保证模型能够处理各种问题。例如:第对比度和高噪声图像,模型可以使用,在这情况下,可以根据实际情况再训练模型,可以提高模型的性能。

4.2 程序示例

* 深度学习提取边缘提取低对比度和高噪声图像。

* 
dev_update_off ()
dev_close_window ()
* 
* 获取图像大小,所设置的值是必须能够被16整除
ImageWidth := 384
ImageHeight := 384
* 
dev_disp_description_intro ()
stop ()
dev_close_window ()
* 
* 深度学习所需硬件需求
* 需要时GPU或CPU
* 本程序是GPU推理部署
* 

query_available_dl_devices (['runtime', 'runtime'], ['gpu', 'cpu'], DLDeviceHandles)
if (|DLDeviceHandles| == 0)
    throw ('No supported device found to continue this example.')
endif
* Due to the filter used in query_available_dl_devices, the first device is a GPU, if available.
DLDevice := DLDeviceHandles[0]
* 
* Read the deep learning model and set model parameters.读取深度学习模型和加载模型参数
read_dl_model ('pretrained_dl_edge_extractor.hdl', DLModelHandle)
set_dl_model_param (DLModelHandle, 'batch_size', 1)
set_dl_model_param (DLModelHandle, 'image_dimensions', [ImageWidth,ImageHeight,1])
set_dl_model_param (DLModelHandle, 'device', DLDevice)
create_dl_preprocess_param_from_model (DLModelHandle, 'none', 'full_domain', [], [], [], DLPreprocessParam)
* 
* 读取图像并显示结果
read_image (Image, 'brake_disk/brake_disk_bike_01')
crop_rectangle1 (Image, Image, 25, 55, 470, 500)
zoom_image_size (Image, Image, ImageWidth, ImageHeight, 'constant')
dev_open_window (0, 0, ImageWidth, ImageHeight, 'black', WindowHandle)
set_display_font (WindowHandle, 15, 'mono', 'true', 'false')
dev_set_color ('cyan')
WaitSeconds := 0.7
DisplayDilation := 1
* 
* 设置最小置信度值
MinConfidence := 0.8
* 
* Example 1: 提取低对比度图像边缘
ScaleMult := [0.865, 0.43, 0.216, 0.085, 0.025]
ScaleAdd := [0, 60, 90, 120, 120]
for Index := 0 to |ScaleMult| - 1 by 1
    scale_image (Image, ImageScaled, ScaleMult[Index], ScaleAdd[Index])
    * 
    apply_dl_edge_extractor (ImageScaled, ConfidentEdgeRegion, DLModelHandle, DLPreprocessParam, MinConfidence)
    skeleton (ConfidentEdgeRegion, DLEdges)
    * 
    * 显示图像和结果
    min_max_gray (ImageScaled, ImageScaled, 0, Min, Max, Range)
    DisplayText := 'Contrast: ' + Range
    dev_display (ImageScaled)
    dev_disp_text ('Example 1', 'window', 'top', 'left', 'black', [], [])
    dev_disp_text (DisplayText, 'window', 'top', 'right', 'black', [], [])
    wait_seconds (WaitSeconds)
    dev_clear_window ()
    dev_display (ImageScaled)
    dilation_circle (DLEdges, DLEdgesDisplay, DisplayDilation)
    dev_display (DLEdgesDisplay)
    dev_disp_text ('Example 1', 'window', 'top', 'left', 'black', [], [])
    dev_disp_text (DisplayText, 'window', 'top', 'right', 'black', [], [])
    wait_seconds (WaitSeconds)
endfor
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
* Example 2: 提取图像模糊的边缘
BlurSizes := [2:2:10]
for Index := 0 to |BlurSizes| - 1 by 1
    mean_image (Image, ImageBlur, BlurSizes[Index], BlurSizes[Index])
    * 
    apply_dl_edge_extractor (ImageBlur, ConfidentEdgeRegion, DLModelHandle, DLPreprocessParam, MinConfidence)
    skeleton (ConfidentEdgeRegion, DLEdges)
    * 
    * 显示图像和结果
    DisplayText := 'Blur size: ' + BlurSizes[Index]
    dev_display (ImageBlur)
    dev_disp_text ('Example 2', 'window', 'top', 'left', 'black', [], [])
    dev_disp_text (DisplayText, 'window', 'top', 'right', 'black', [], [])
    wait_seconds (WaitSeconds)
    dev_clear_window ()
    dev_display (ImageBlur)
    dilation_circle (DLEdges, DLEdgesDisplay, DisplayDilation)
    dev_display (DLEdgesDisplay)
    dev_disp_text ('Example 2', 'window', 'top', 'left', 'black', [], [])
    dev_disp_text (DisplayText, 'window', 'top', 'right', 'black', [], [])
    wait_seconds (WaitSeconds)
endfor
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
* Example 3: 提取高噪点图像边缘
NoiseTypes := ['white', 'gradient', 'scanline']
NoiseLevels := [30:30:150]
for TypeIndex := 0 to |NoiseTypes| - 1 by 1
    for LevelIndex := 0 to |NoiseLevels| - 1 by 1
        add_noise (Image, ImageNoise, NoiseTypes[TypeIndex], NoiseLevels[LevelIndex])
        * 
        apply_dl_edge_extractor (ImageNoise, ConfidentEdgeRegion, DLModelHandle, DLPreprocessParam, MinConfidence)
        skeleton (ConfidentEdgeRegion, DLEdges)
        * 
        * 显示图像和结果
        DisplayText := 'Noise type : ' + NoiseTypes[TypeIndex] + '\nNoise level: ' + NoiseLevels[LevelIndex]
        dev_display (ImageNoise)
        dev_disp_text ('Example 3', 'window', 'top', 'left', 'black', [], [])
        dev_disp_text (DisplayText, 'window', 'top', 'right', 'black', [], [])
        wait_seconds (WaitSeconds)
        dev_clear_window ()
        dev_display (ImageNoise)
        dilation_circle (DLEdges, DLEdgesDisplay, DisplayDilation)
        dev_display (DLEdgesDisplay)
        dev_disp_text ('Example 3', 'window', 'top', 'left', 'black', [], [])
        dev_disp_text (DisplayText, 'window', 'top', 'right', 'black', [], [])
        wait_seconds (WaitSeconds)
    endfor
endfor
* 
disp_end_of_program_message (WindowHandle, 'black', 'true')

在这里插入图片描述
琐碎时间阅读基础知识,详情关注微信公众号“知识代码AI”。
在这里插入图片描述

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

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

相关文章

G1简介、各种GC总结

概述 G1首次出现是在JDK 6u14版本里作为体验版,JDK 7u4版本被正式推出,JDK 9中被设置为默认垃圾收集器(参考JEP 248)。 G1全称是Garbage First,目标:延迟可控的情况下,尽可能高的吞吐量。一款…

怎么使用Element ui来做一个前端登录页面

找到Layout 布局 他通过基础的 24 分栏,迅速简便地创建布局。 找一个对齐方式 这个就不错,找到对应的代码 这个 复制进入idea 引入我们的图片和文字 我这里图片有点问题 然后我再添加一条分割线 加入表单校验 把里面的代码同上加入idea 结果 对表单内容进行调整 …

CAPL使用结构体的方式组装一条DoIP车辆声明消息

如果你参加过我的《CAPL编程系统性课程》,你就结构体类型天然就能表示报文结构,用结构体表示报文虽然麻烦,但灵活度更高。 我们今天试着用结构体类型表示DoIP车辆声明消息的DoIP报头,然后组装一条DoIP消息发送出去。 DoIP消息结构如下: DoIP车辆声明消息结构如下: /**…

等保测评练习卷22

等级保护初级测评师试题22 姓名: 成绩: 一、判断题(10110分) 1. 在应用系统测试中,如果审计是一个独立的功能,那么应用系统应对审计进程进行保…

python反序列化

🎼个人主页:金灰 😎作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️ 🍊易编橙终身成长社群&#…

Blackcat V2.2付费会员制WordPress资源站主题

Blackcat-付费会员制WordPress资源站主题,该主题是基于简约实用的主题选项框架 Codestar Framework 进行开发的功能强大的付费会员制主题,该主题尤其适合用于搭建付费下载资源网站,比如素材站、软件站、视频教程站等付费资源下载网站。 集成…

unity2D游戏开发17战斗精灵

导入 将PlayerFight32x32.png拖Player文件夹进去 设置属性 创建动画剪辑 选中前四帧,右键Create|Animation,将动画命名为player-ire-east 其他几个动画也创建好后,将其拖到Animations|Animations文件夹 选中PlayerController,再点击Animator 创建新的Blend Tree Graph,并重…

JAVA基础 - 图形页面

目录 一. 简介 二. Swing 技术基础 三. 事件处理模型 四. 适配器 五. 布局管理 六. 可视化工具 一. 简介 Java 图形用户界面技术主要有: AWT 、 Applet 、 Swing和 JavaFX 。 AWT(Abstract Window Toolkit,抽象窗口工具包) …

全文最详细CPP/XCP标定协议讲解:命令传输对象CTO

全文最详细CPP/XCP标定协议讲解:命令传输对象CTO 1.概述 CTOs(命令传输对象)用于从主设备向从设备传输命令,以及从从设备向主设备传输响应。 命令结构: 从设备从主设备接收命令,并必须用肯定或否定的响应来做出反应,通信结构如下: 请求报文 每个命令都会被分配一个唯…

Temporal(时效)模式03

正如“问题”一节所说,如果有必要,我们不排除为Skill类提供一个类似的接口的可能性。由于使用 了《temporal》版型,“问题”一节中复杂的图变得简单多了(见图7)。 图7:使用版型后的Employee模型 效果 √ 我…

xAI 可能收购 Character.AI 以测试 Grok 聊天机器人

🦉 AI新闻 🚀 xAI 可能收购 Character.AI 以测试 Grok 聊天机器人 摘要:马斯克的人工智能初创公司 xAI 正考虑收购聊天机器人制造商 Character.AI,以测试其 Grok 聊天机器人。这种收购可能意在降低训练和运行 AI 模型的高昂成本…

浩瀚、西圣、博雅无线领夹麦克风值得买吗?深度测评三大热门品牌

​无线领夹麦克风是当下热门的音频工具,很多新用户不知买啥牌子,不了解销量口碑,选购易迷茫。作为音频设备测评博主,被问最多的是浩瀚、西圣、博雅等是否值得买。参考数据,口碑好的有西圣、猛犸、博雅等。西圣的认可度…

【北京仁爱堂】痉挛性斜颈一定不能吃的5种食物,好多患者都因此导致病情加重了!

痉挛性斜颈,作为一种神经系统疾病,其发病机制复杂,症状表现为颈部肌肉不自主收缩,导致头部偏向一侧,不仅影响患者的外貌形象,更严重地干扰了他们的日常生活与工作。在治疗与康复过程中,合理的饮…

新版绿豆视频APP视频免授权源码6.1版本_插件版

新版绿豆视频APP视频免授权源码插件版后端插件开源,可直接反编译修改方便,对接苹果CMS,自定义DIY页面布局! 绿豆影视APP对接苹果cms,所有页面皆可通过后端自由定制,此版本后端源码前端是壳(反编译版本)&am…

SpringBoot 中优化 if-else 语句的七种方法实战

SpringBoot 中优化 if-else 语句的七种方法实战 🚀 🔥 SpringBoot 中优化 if-else 语句的七种方法实战 🚀摘要引言正文内容1. 策略模式 🎯实战案例:支付功能 2. 枚举与策略模式结合 🔄实战案例:…

Kafka操作

目录 一、创建主题 二、查看主题 三、修改分区数 四、删除主题 五、生产数据 六、创建消费组 一、创建主题 --- kafka-topics.sh ---bootstrap-server 指定连接的kafka服务 - --create 创建主题 - --partitions 指定分区数 默认一个 - --replication-factor 指定分区中的…

中文竞技场大测评

中文竞技场大测评 活动入口大模型评测写作创作相关代码相关知识常识中文游戏人类价值观模型自动对话 体验感受 活动入口 这次的中文竞技场大模型评测活动,内容很有趣,包含了写作创作相关、代码相关、知识常识、中文游戏、人类价值观、NLP专业领域这6个领…

记录Maven打包Java web项目时提示webxml attribute is required

经各种搜索后发现每次打包web文件夹的映射,莫名其妙被改为webapp(不知道是idea还是Maven的锅) 直接把web文件夹改成webapp好了,,还是不要自定义web文件夹的名称了。真的栓Q ​​​​​​☞☜

程序员面试中的“八股文”:助力还是阻力?

目录 前言1. “八股文”的定义与起源1.1 “八股文”的历史背景1.2 “八股文”在程序员面试中的应用 2. “八股文”的优点与作用2.1 标准化评估工具2.2 强化基础知识2.3 短时间内展示能力 3. “八股文”的局限与争议3.1 忽视实际操作能力3.2 过度依赖背题能力3.3 压制创新思维 4…