算法功能:边缘缺陷检测

请添加图片描述

*2. 算法思路:
*      (1)初始化
*      (2)使用canny滤波器边缘检测
*      (3)缺陷检测
*           --计算待检测边缘上的点到平滑后边缘的距离,超过一定阈值公差即为缺陷
*      (4)结果显示

*-----------------------初始化--------------------------

dev_update_off ()
*声明空对象,用于保存缺陷边缘
gen_empty_obj(FlawEdgeObject)
*读图
read_image (Image1, 'C:/Users/Administrator/Desktop/1.bmp')

*-----------------------边缘检测--------------------------

*阈值分割+形态学处理,将包含边缘部分图像进行抠图
binary_threshold (Image1, Region, 'smooth_histo', 'light', UsedThreshold)
connection(Region, ConnectedRegions)   
select_shape(ConnectedRegions, SelectedRegions, ['area','anisometry'], 'and', [10000,0.8], [99999,2]) 
closing_circle(SelectedRegions, RegionClosing, 1)
dilation_circle (RegionClosing, RegionDilation, 3.5)
erosion_circle (RegionClosing, RegionErosion, 3.5)
difference (RegionDilation, RegionErosion, RegionDifference)
*抠图处理,得到包换边缘部分图像
reduce_domain (Image1, RegionDifference, ImageReduced)
*使用canny滤波器进行边缘检测
edges_sub_pix (ImageReduced, Edges1, 'canny', 3, 20, 40)
*边缘处理
select_contours_xld (Edges1, SelectedContours, 'contour_length', 10, 2000, -0.5, 0.5)
union_adjacent_contours_xld (SelectedContours, UnionContours, 10, 1, 'attr_keep')

*-----------------------缺陷检测--------------------------
*计算边缘个数,分别进行缺陷检测
count_obj(UnionContours, Number)    

for Index := 1 to Number by 1
    
      *-----算法核心:计算待检测边缘上的点到平滑后边缘的距离,超过一定阈值公差即为缺陷--------
      *选择待检测边缘
      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)
endfor
      
dev_display (Image1)
dev_display (FlawEdgeObject)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖子工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值