halcon学习笔记(一)毛边检测 仿射变换+标准区域登陆检测内外边缘毛边

一、中级视频教程毛刺检测:

实现功能,检测突出产品外围突出的毛刺:

1.先获取背景的区域,用 binary_threshold()获取背景区域A;

2.背景区域进行闭运算得到闭运算区域B

3.用difference()算子计算A B两个区域的补集C;

4.对C进行开运算,使边缘平滑。记得到边缘突出的毛刺

使用到的算子:

binary_threshold()自动全局阈值,得到背景获背景和前景,适合使用在背景和前景差异明显的图像检测;

difference()得到两区域补集

area_center()得到区域的面积和中心坐标

 

**************************************************第一步  初始化****************************
*关闭通过调用算子在图像窗口上更新图像,单步模式下无效
dev_update_window ('off')
*批量读取3张图像
* read_image (Fins, 'fin' + [1:3])
read_image (NG1, 'F:/工作/新建文件夹/工作/1.四月/5.三卓韩一/黑色样品一/毛边/Image_20210402162842007.bmp')
read_image (NG2, 'F:/工作/新建文件夹/工作/1.四月/5.三卓韩一/黑色样品一/毛边/Image_20210402162849240.bmp')
read_image (NG3, 'F:/工作/新建文件夹/工作/1.四月/5.三卓韩一/黑色样品一/毛边/Image_20210402162207016.bmp')
*如何自定义图像变量用来测试
testimage:=NG1
*获取图像大小
get_image_size (testimage, Width, Height)
*关闭已经打开的窗口
dev_close_window ()
*打开一个新的窗口
dev_open_window (0, 0, Width[0], Height[0], 'black', WindowID)
*设置字体的信息:字体大小:14;字体:mono;粗体,非斜体
* set_display_font (WindowID, 14, 'mono', 'true', 'false')
**************************************************第二步  图像处理****************************
* for I := 1 to 3 by 1
    *从图像集合里获取一张图像
*     select_obj (Fins, Fin, I)    
    *显示图像
    dev_display (testimage)    
    *二值化分割图像,使用自动全局阈值分割单通道图像.
    binary_threshold (testimage, Background, 'max_separability', 'light', UsedThreshold)    
    *设置对象的输出颜色为蓝色
    dev_set_color ('blue')   
    *设置区域的填充方式
    dev_set_draw ('fill')    
    *设置输出对象的线宽度
    dev_set_line_width (4)    
    *显示背景区域
    dev_display (Background)
    *闭运算,平滑背景边界
    closing_circle (Background, ClosedBackground, 73)    
    *设置输出对象的显示颜色为绿色
    dev_set_color ('green')    
    *显示闭运算后的背景区域
    dev_display (ClosedBackground)
    *闭运算后的背景区域和原背景区域进行求补集
    difference (ClosedBackground, Background, RegionDifference)   
    *开运算,消除边界毛刺
    opening_rectangle1 (RegionDifference, FinRegion, 5, 5)    
    *显示图像
    dev_display (testimage)    
    * 设置输出对象的显示颜色为红色
    dev_set_color ('yellow') 
    *显示最后检出的毛刺
    dev_display (FinRegion)    
    *获取毛刺的面积和坐标
    area_center (FinRegion, FinArea, Row, Column)

原图:halcon学习笔记(一)毛边检测 仿射变换+标准区域登陆检测内外边缘毛边_第1张图片

图像A:halcon学习笔记(一)毛边检测 仿射变换+标准区域登陆检测内外边缘毛边_第2张图片

图像B:halcon学习笔记(一)毛边检测 仿射变换+标准区域登陆检测内外边缘毛边_第3张图片

图像C:halcon学习笔记(一)毛边检测 仿射变换+标准区域登陆检测内外边缘毛边_第4张图片

问题:该方法对较明显的特定的毛刺毛边效果有效,针对一些边缘比较复杂和毛边形状跟边缘较接近的缺陷效果差

如下图所示:闭运算无法完全把毛刺边缘补全,导致,检测的毛刺不完整。可能到会细小毛边漏检。

halcon学习笔记(一)毛边检测 仿射变换+标准区域登陆检测内外边缘毛边_第5张图片  halcon学习笔记(一)毛边检测 仿射变换+标准区域登陆检测内外边缘毛边_第6张图片halcon学习笔记(一)毛边检测 仿射变换+标准区域登陆检测内外边缘毛边_第7张图片  halcon学习笔记(一)毛边检测 仿射变换+标准区域登陆检测内外边缘毛边_第8张图片

二、毛边检测算法优化:标准区域登陆+仿射变换(该算法需产品来料方向变化在+-45°以内)

实现方法:1.获取标准合格品图像检测区域A,2.对A进行膨胀,得到区域B。3.B-A得到实际想要检测毛边的区域C;4.将待检产品图像D进行仿射变换得到图像E;

5用区域C对图像E进行剪切,得到图像F;6.对图像F进行二值化得到缺陷区域G。

主要用到的算子:

difference()计算两区域的补集获取毛边检测区域

smallest_rectangle2()获取区域的坐标和角度;vector_angle_to_rigid()计算两个区域的转换关系

affine_trans_image()对图像进行仿射变化

read_image (NG1, 'F:/工作/新建文件夹/工作/1.四月/5.三卓韩一/黑色样品一/毛边/Image_20210402162842007.bmp')
* read_image (NG1, 'F:/工作/新建文件夹/工作/1.四月/5.三卓韩一/黑色样品一/毛边/Image_20210402162849240.bmp')
* read_image (NG1, 'G:/学习/技术博客/1.jpg')

read_image (OK1, 'F:/工作/新建文件夹/工作/1.四月/5.三卓韩一/黑色样品一/毛边/Image_20210402162207016.bmp')
* read_image (NG1, 'F:/工作/新建文件夹/工作/1.四月/5.三卓韩一/黑色样品一/堵孔/Image_20210402162834992.bmp')

* binary_threshold (NG1, Region, 'max_separability', 'light', UsedThreshold)
*获取标准区域:(检测内圈毛刺区域获取)
threshold (OK1, Region1, 100, 255)
closing_circle (Region1, RegionClosing, 70)
connection (RegionClosing, ConnectedRegions)
select_shape (ConnectedRegions, RegionsBZ, 'area', 'and', 150, 100000)
  dev_display(OK1)
dev_display (RegionsBZ)



*获取外圈的检测区域
threshold (OK1, Region4, 0, 40)
*膨胀将毛边检测区域进行扩大
dilation_circle (Region4, RegionDilation,30)
difference (RegionDilation, Region4, Regiondf)
erosion_circle (Regiondf, RegionMBJC, 5)
*  binary_threshold (OK1, Region5, 'max_separability', 'light', UsedThreshold)
* threshold (OK1, Region5, 40, 255)
*******************************仿射变换获取内孔检测区域***********
*获取标准仿射变换原点
* draw_rectangle1 (200000, Row12, Column12, Row2, Column2)
* gen_rectangle1 (Rectangle, Row12, Column12, Row2, Column2)
* reduce_domain (OK1, Rectangle, ImageReduced1)
threshold (OK1, Region2, 0, 20)
* area_center (Region, Area, Row, Column)
smallest_rectangle2 (Region2, Row1, Column1, Phi, Length1, Length2)


*实现检测图像的仿射变换
threshold (NG1, Region3, 0, 15)
* area_center (Region, Area, Row, Column)
*实现图像的仿射变换的三个主要算子
smallest_rectangle2 (Region3, Row11, Column11, Phi1, Length11, Length21)
vector_angle_to_rigid (Row11, Column11, Phi1, Row1, Column1, Phi, HomMat2D)
affine_trans_image (NG1, ImageAffineTrans, HomMat2D, 'constant', 'false')

  dev_display(OK1)
dev_display (ImageAffineTrans)
reduce_domain (ImageAffineTrans, RegionMBJC, ImageReduced)
threshold (ImageReduced, Region, 0, 95)
opening_circle (Region, RegionOpening1, 4)
dev_set_draw ('fill')
dev_display(ImageAffineTrans)
dev_display (RegionOpening1)

标准品图片:halcon学习笔记(一)毛边检测 仿射变换+标准区域登陆检测内外边缘毛边_第9张图片

A:

B:halcon学习笔记(一)毛边检测 仿射变换+标准区域登陆检测内外边缘毛边_第10张图片

 

C:halcon学习笔记(一)毛边检测 仿射变换+标准区域登陆检测内外边缘毛边_第11张图片

D:halcon学习笔记(一)毛边检测 仿射变换+标准区域登陆检测内外边缘毛边_第12张图片

待检图像:halcon学习笔记(一)毛边检测 仿射变换+标准区域登陆检测内外边缘毛边_第13张图片

E:halcon学习笔记(一)毛边检测 仿射变换+标准区域登陆检测内外边缘毛边_第14张图片

F:halcon学习笔记(一)毛边检测 仿射变换+标准区域登陆检测内外边缘毛边_第15张图片

G:halcon学习笔记(一)毛边检测 仿射变换+标准区域登陆检测内外边缘毛边_第16张图片

总结:该方法针对产品一致性比较好的产品检测效果比较理想。当产品形状有细微差异时,标准图像的区域就不能完全覆盖到形状发生变化的产品的检测区域。

当产品来料状态存在360°旋转变化时,该方法进行的仿射变化也有很大局限性。需对仿射变换进行优化。当缺陷面积较大时,会影响仿射变换的结果,导致整个检测区域偏移,故需要使用模板匹配来进行仿射变换。

毛边检测算法优化(二):对区域进行仿射变换(未完待续)

毛边检测算法优化(三):使用模板匹配对图像进行仿射变换(未完待续)

毛边检测算法优化(四):检测图像与待检图像进行图像相减操作(未完待续)

 

 

你可能感兴趣的:(halcon,算法,人工智能,计算机视觉)