halcon 边缘检测

公众号:机器视觉那些事儿
这里写图片描述

知识点是鱼,套路是渔。授人以鱼不如授人以渔!”

一般在做项目时,无论是边缘检测、瑕疵检测、Blob检测等应用,都有一定的通用套路,也可以说是通用处理框架,在此框架下根据具体应用具体分析,基本上所有项目都可完成。总结起来,

通用套路 + 灵活运用

对于初学者来说,只需掌握通用套路即可,灵活运用需要经过大量的练习才可达到,运用大学里学马克思哲学时的一句话概括,“量变引起质变”,当你达到这个程度之时,俨然成为集大成者了。

边缘检测通用思路:

  1. 设置ROI感兴趣区域,此区域需包含待检测边缘;

  2. 二值化处理,并打散连接区域,进一步选取目标区域;

  3. 将目标区域进行膨胀处理;

  4. 将目标区域进行腐蚀处理;

  5. 将膨胀后的区域和腐蚀后的区域进行减操作,并进行抠图处理,目的为了得到有边缘的真实图像;

  6. 使用边缘检测算子提取亚像素轮廓;

  7. 根据得到的真实边缘,进步处理和计算所需的线、弧、圆等;

现学现用:检测圆

处理思路:1. 根据以上所讲套路,求得外边缘轮廓;

                  2. 根据所得轮廓,拟合圆;

1

检测外边缘轮廓

外边缘处理后,如下图所示,会提取一些干扰轮廓,第2部分–拟合圆,会对此进行处理。

附第一部分 halcon源代码

*读入图片
read_image (Image, ‘cicle.bmp’)

*计算图片大小,并以原图尺寸显示
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window_fit_size (0, 0, Width, Width, -1, -1, WindowHandle)
dev_display (Image)

*01. 设置ROI感兴趣区域
gen_rectangle1 (ROI, 50, 50, 550, 550)
reduce_domain (Image, ROI, ImageReduced)

*02. 二值化处理,并打散连接区域,选取目标区域
threshold (ImageReduced, Regions, 23, 255)
connection (Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 57706.4, 86146.8)

*03. 将目标区域进行膨胀处理
dilation_circle (SelectedRegions, RegionDilation, 10)

*04. 将目标区域进行腐蚀处理
erosion_circle (SelectedRegions, RegionErosion, 4)
*填充孔洞
fill_up (RegionErosion, RegionFillUp)

*05. 将膨胀后的区域和腐蚀后的区域进行减操作,并进行抠图处理,目的为了得到有边缘的真实图像
difference (RegionDilation, RegionFillUp, RegionDifference)
union1 (RegionDifference, RegionUnion)
reduce_domain (ImageReduced, RegionUnion, ImageReduced1)

*06. 使用canny算子提取亚像素轮廓
edges_sub_pix (ImageReduced1, Edges, ‘canny’, 1, 20, 40)

2

拟合圆

此时进行套路中的最后一步,根据得到的真实边缘,进步处理和计算所需的线、弧、圆等,在这一步我们常用分割函数 segment_contours_xld,联合相邻直线函数 union_collinear_contors_xld,选择轮廓函数select_contours_xld,联合相同圆函数 union_cocircular_contours_xld等函数,进一步对边缘轮廓处理,也可根据找到的轮廓边缘,得到点云数据,拟合成圆、直线、椭圆等;

处理后如下图所示。

附第二部分 halcon源代码

*07. 根据得到的真实边缘,进步处理和计算所需的线、弧、圆等
segment_contours_xld (Edges, ContoursSplit, ‘lines_circles’, 5, 4, 2)
select_contours_xld (ContoursSplit, SelectedContours, ‘contour_length’, 8, 1000, -0.5, 0.5)
union_adjacent_contours_xld (SelectedContours, UnionContours3, 10, 1, ‘attr_keep’)
fit_circle_contour_xld (UnionContours3, ‘algebraic’, -1, 0, 0, 3, 2, Row1, Column1, Radius1, StartPhi, EndPhi, PointOrder)
gen_circle (Circle, Row1, Column1, Radius1)

*显示结果
dev_set_line_width (2)
dev_set_draw (‘margin’)
dev_display (Image)
dev_display (Circle)

原图及完整源代码见百度网盘:

链接:https://pan.baidu.com/s/1FLZGJ7abz7CoqoweuGv3uQ 密码:au2h

  • 2
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值