一、中级视频教程毛刺检测:
实现功能,检测突出产品外围突出的毛刺:
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)
问题:该方法对较明显的特定的毛刺毛边效果有效,针对一些边缘比较复杂和毛边形状跟边缘较接近的缺陷效果差
如下图所示:闭运算无法完全把毛刺边缘补全,导致,检测的毛刺不完整。可能到会细小毛边漏检。
二、毛边检测算法优化:标准区域登陆+仿射变换(该算法需产品来料方向变化在+-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)
A:
总结:该方法针对产品一致性比较好的产品检测效果比较理想。当产品形状有细微差异时,标准图像的区域就不能完全覆盖到形状发生变化的产品的检测区域。
当产品来料状态存在360°旋转变化时,该方法进行的仿射变化也有很大局限性。需对仿射变换进行优化。当缺陷面积较大时,会影响仿射变换的结果,导致整个检测区域偏移,故需要使用模板匹配来进行仿射变换。
毛边检测算法优化(二):对区域进行仿射变换(未完待续)
毛边检测算法优化(三):使用模板匹配对图像进行仿射变换(未完待续)
毛边检测算法优化(四):检测图像与待检图像进行图像相减操作(未完待续)