“ 知识点是鱼,套路是渔。授人以鱼不如授人以渔!”
一般在做项目时,无论是边缘检测、瑕疵检测、Blob检测等应用,都有一定的通用套路,也可以说是通用处理框架,在此框架下根据具体应用具体分析,基本上所有项目都可完成。总结起来,
通用套路 + 灵活运用
对于初学者来说,只需掌握通用套路即可,灵活运用需要经过大量的练习才可达到,运用大学里学马克思哲学时的一句话概括,“量变引起质变”,当你达到这个程度之时,俨然成为集大成者了。
边缘检测通用思路:
01. 设置ROI感兴趣区域,此区域需包含待检测边缘;
02. 二值化处理,并打散连接区域,进一步选取目标区域;
03. 将目标区域进行膨胀处理;
04. 将目标区域进行腐蚀处理;
05. 将膨胀后的区域和腐蚀后的区域进行减操作,并进行抠图处理,目的为了得到有边缘的真实图像;
06. 使用边缘检测算子提取亚像素轮廓;
07. 根据得到的真实边缘,进步处理和计算所需的线、弧、圆等;
现学现用:检测圆
处理思路: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