原图来自Ihalcon论坛
缺陷如在下图圆框中
首先,阈值分割+形态学处理,将包含边缘部分图像进行抠图
然后使用canny滤波器进行边缘检测
如下图红、绿双线
将凸起部分平滑掉,细节如下右图
计算待检测边缘上的点到平滑后边缘的距离,超过一定阈值公差即为缺陷
如下图
缺陷检测关键代码
*选择待检测边缘 select_obj(UnionContours, ObjectSelected, Index) *平滑边缘 smooth_contours_xld (ObjectSelected, SmoothedContours, 89) *阈值公差 disTH := 5 *用于保存缺陷边缘X坐标 flawPtsX :=[] *用于保存缺陷边缘Y坐标 flawPtsY :=[] *得到待检测边缘点坐标 get_contour_xld(ObjectSelected, Row2, Col2) *待检测边缘上点到平滑边缘的距离 tuple_length(Row2, Length) for Index1 := 0 to Length-1 by 1 distance_pc(SmoothedContours, Row2[Index1], Col2[Index1], DistanceMin, DistanceMax) *根据公差判断是否合格 if(DistanceMin > disTH) flawPtsX :=[flawPtsX,Col2[Index1]] flawPtsY :=[flawPtsY,Row2[Index1]] endif endfor *将缺陷点生成区域,并进一步筛选 gen_region_points(Region1, flawPtsY, flawPtsX) dilation_circle(Region1, RegionDilation, 5) connection(RegionDilation, ConnectedRegions1) select_shape(ConnectedRegions1, SelectedRegions1, 'area', 'and', 200, 99999) gen_empty_obj(EmptyObject) count_obj(SelectedRegions1, Number1) *再从筛选后的区域,选择不合格的边缘 for Index1 := 1 to Number1 by 1 select_obj(SelectedRegions1, ObjectSelected2, Index1) smallest_rectangle1(ObjectSelected2, Row11, Column11, Row21, Column2) clip_contours_xld(ObjectSelected, ClippedContours, Row11, Column11, Row21, Column2) concat_obj(EmptyObject, ClippedContours, EmptyObject) endfor *连接相邻不合格边缘缺陷 union_adjacent_contours_xld(EmptyObject, EmptyObject, 50, 1, 'attr_keep') *合并缺陷 concat_obj(FlawEdgeObject, EmptyObject, FlawEdgeObject)
原图及详细注释的完整源代码见链接:
https://download.csdn.net/download/suneggs/12611149
本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:


