原图来自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://pan.baidu.com/s/178KvG8Gav1PWOeA-Wrbc2g 提取码: kwpa 复制这段内容后打开百度网盘手机App,操作更方便哦