0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

模板变形后如何进行缺陷检测

新机器视觉 来源:机器视觉课堂 2024-01-14 14:06 次阅读

引言

机器视觉中缺陷检测分为一下几种:

  • blob分析+特征

  • 模板匹配(定位)+差分

  • 光度立体:halcon——缺陷检测常用方法总结(光度立体)

  • 特征训练

  • 测量拟合

  • 频域+空间域结合:halcon——缺陷检测常用方法总结(频域空间域结合)

  • 深度学习

本篇主要总结一下缺陷检测中的定位+差分的方法。即用形状匹配,局部变形匹配去定位然后用差异模型去检测缺陷。

模板匹配(定位)+差分

整体思路(形状匹配):

  1. 先定位模板区域后,求得模板区域的坐标,创建物品的形状模板create_shape_model,注意把模板的旋转角度改为rad(0)和rad(360)。

  2. 匹配模板find_shape_model时,由于物品的缺陷使形状有局部的改变,所以要把MinScore设置小一点,否则匹配不到模板。并求得匹配项的坐标。

  3. 关键的一步,将模板区域仿射变换到匹配成功的区域。由于差集运算是在相同的区域内作用的,所以必须把模板区域转换到匹配项的区域。

  4. 之后求差集,根据差集部分的面积判断该物品是否有缺陷。

模板匹配(定位)+差分的方法主要用来检测物品损坏,凸起,破洞,缺失,以及质量检测等。

halcon例程分析:

1.印刷质量缺陷检测(print_check.hdev)

该例程用到了差异模型,将一个或多个图像同一个理想图像做对比,去找到明显的不同。进而鉴定出有缺陷的物体。差异模型的优势是可以直接通过它们的灰度值做比较,并且通过差异图像,比较可以被空间地加权。

变化模型检测缺陷的整体思路:

  • create_variation_model —— 创建一个差异模型

  • get_variation_model —— 获得差异模型

  • train_variation_model —— 训练差异模型

  • prepare_variation_model —— 准备差异模型

  • compare_variation_model —— 比较模型与实例

  • clear_variation_model —— 清除差异模型

dev_update_off ()
* 选择第1张图像创建形状模板
read_image (Image, 'pen/pen-01')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_set_color ('red')
dev_display (Image)
* 把我感兴趣的区域抠出来,原则上范围越小越好,因为这样创建模板时干扰会少很多
threshold (Image, Region, 100, 255)
fill_up (Region, RegionFillUp)
difference (RegionFillUp, Region, RegionDifference)
shape_trans (RegionDifference, RegionTrans, 'convex')
dilation_circle (RegionTrans, RegionDilation, 8.5)
reduce_domain (Image, RegionDilation, ImageReduced)
inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 1, 20)
gen_contours_skeleton_xld (ModelRegions, Model, 1, 'filter')
* 获得抠图区域的中心,这是参考点
area_center (RegionDilation, Area, RowRef, ColumnRef)
* 创建形状模板
create_shape_model (ImageReduced, 5, rad(-10), rad(20), 'auto', 'none', 'use_polarity', 20, 10, ShapeModelID)* 创建变化模型(用于和缺陷比较)
create_variation_model (Width, Height, 'byte', 'standard', VariationModelID)
* 文件夹中前15张图片是质量良好的,可以用来训练模板
for I := 1 to 15 by 1
read_image (Image, 'pen/pen-' + I$'02d')
* 先寻找模板的实例
find_shape_model (Image, ShapeModelID, rad(-10), rad(20), 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score)
if (|Score| == 1)
* 使用仿射变换,将当前图像平移旋转到与模板图像重合,注意是当前图像转向模板图像
vector_angle_to_rigid (Row, Column, Angle, RowRef, ColumnRef, 0, HomMat2D)
affine_trans_image (Image, ImageTrans, HomMat2D, 'constant', 'false')
* 训练差异模型
train_variation_model (ImageTrans, VariationModelID)
dev_display (ImageTrans)
dev_display (Model)
endif
endfor
* 获得差异模型
get_variation_model (MeanImage, VarImage, VariationModelID)
* 做检测之前可以先用下面这个算子对可变模型进行设参,这是一个经验值,需要调试者调整
prepare_variation_model (VariationModelID, 20, 3)
dev_set_draw ('margin')
NumImages := 30
* 可变模板训练完成后,我们终于可以进入主题,马上对所有图像进行缺陷检测,思想就是差分
for I := 1 to 30 by 1
read_image (Image, 'pen/pen-' + I$'02d')
* 要注意做差分的两幅图像分辨率相同,当然也需要通过仿射变换把待检测的图像转到与模板图像重合
* 先寻找模板的实例
find_shape_model (Image, ShapeModelID, rad(-10), rad(20), 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score)
if (|Score| == 1)
* 使用仿射变换,将当前图像平移旋转到与模板图像重合,注意是当前图像转向模板图像
vector_angle_to_rigid (Row, Column, Angle, RowRef, ColumnRef, 0, HomMat2D)
affine_trans_image (Image, ImageTrans, HomMat2D, 'constant', 'false')
* 抠图
reduce_domain (ImageTrans, RegionDilation, ImageReduced)
* 差分 (就是检查两幅图像相减,剩下的区域就是不同的地方了,与模板图像不同的地方就是缺陷)
* 这里可不能用difference做差分啊,halcon为变形模板提供了专门的差分算子:compare_variation_model
compare_variation_model (ImageReduced, RegionDiff, VariationModelID)
connection (RegionDiff, ConnectedRegions)
* 特征选择:用一些特征来判断这幅图像印刷是否有缺陷,这里使用面积
* 其实可以考虑利用区域面积的大小来判断缺陷的严重程度,这里就不过多讨论了
select_shape (ConnectedRegions, RegionsError, 'area', 'and', 20, 1000000)
count_obj (RegionsError, NumError)
dev_clear_window ()
dev_display (ImageTrans)
dev_set_color ('red')
dev_display (RegionsError)
set_tposition (WindowHandle, 20, 20)
if (NumError == 0)
dev_set_color ('green')
write_string (WindowHandle, 'Clip OK')
else
dev_set_color ('red')
write_string (WindowHandle, 'Clip not OK')
endif
endif
if (I < NumImages)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
endif
endfor
* 结语:如果发现前面作为训练变形模板的良好图像也被判定为NG,
*可以调整prepare_variation_model参数
*或者调整select_shape特征筛选的标准

9738e3f2-b28e-11ee-8b88-92fbcf53809c.png

974eac14-b28e-11ee-8b88-92fbcf53809c.png

相关算子分析:

  • create_variation_model(创建一个差异模型)

create_variation_model(Width, Height, Type, Mode ,ModelID)
//创建一个ID为ModelID,宽为Width,高为Height,类型为Type的差异模型参数

参数Mode决定了创建标准图像和相应的变化图像的方法。(可选三种方法)

  1. 'standard'表示标准的训练方法,标准图像的位置是各训练图像位置的平均,

  2. 'robust'表示鲁棒的训练方法,标准图像的位置是各训练图像的中值,此模式在训练图像中可能存在ERROR时使用,

  3. 'direct'表示标准图像由单张图像经过处理得到,由此方法得到的标准图像只能应用prepare_direct_variation_model算子得到variation model。

  • get_variation_model(获得差异模型)

get_variation_model(Image, VarImage ,ModelID  )
//返回差异模型中的标准图像(Image)和差异图像(VarImage),此算子主要用来检视创建的差异模型是否OK。

train_variation_model(训练差异模型)

train_variation_model(Images, ModelID )

prepare_variation_model(准备差异模型)

prepare_variation_model( : : ModelID, AbsThreshold, VarThreshold : )
//设置variation model(差异模型)的绝对阈值和相对阈值。
  //绝对阈值即待检测图像与标准图像的差值,
  //相对阈值即待检测图像与variation model与VarThreshold乘积的差值。

compare_variation_model(比较模型与实例)

compare_variation_model(Image : Region : ModelID : )
//待检测图像与variation model进行比较,超过阈值的区域在Rgion参数中返回。
  同threshold一样,返回的区域被看做一个区域,可以使用connection算子进行连通性分析,然后根据区域的特征(如面积)对区域进行选择。

总结:

差异模型(Variation Model)使用标准图像与待检测图像灰度值相比较,来判断产品是否OK,适用于印刷品检测及产品表面检测。

从实际算法过程可以看出,此检测实际可分为两部分:

对于图像中的大面积灰度一致区域,主要利用待检测图像与标准图像(ideal image)比较得出差异区域,对于图像中的边缘位置(edges)区域,主要利用待检测图像与Variation图像(variation image)比较得出差异区域。

所以在实际应用中,应根据实际情况设置AbsThreshold和VarThreshold的值。

2,检测工件孔洞毛刺缺陷 - 局部变形匹配(inspect_gasket_local_deformable.hdev)

在日常工程应用中,我们通常通过halcon的形状匹配(shape-based matching)进行各种定位,正如上篇例程,当待匹配物体有轻微变形时,并不影响得到的匹配结果,然后当待匹配物体有较大变形时,如塑料产品在成形时变形、纺织产品的花纹因为褶皱变形等,要想得到精确的定位结果就显得捉襟见肘,如下图所示,工件如果有较大变形,在用形状匹配时,定位结果就不尽如人意,因为形状匹配本身得到的匹配结果只是一个点(row,col)。

因此本篇例程使用了局部变形匹配(local deformable matching),匹配结果可以根据待匹配物体自动进行变形。而且在这个案例中,create_variation_model (Width, Height, ‘byte’, ‘direct’, VariationModelID)使用的方法是’direct’,因此是不需要训练差异模型而可以直接使用的。

1、读入标准图像,创建差异模型以及匹配模板

1.读入图像
dev_update_off ()
dev_get_window (WindowHandle)
set_display_font (WindowHandle, 36, 'mono', 'true', 'false')
dev_set_draw ('margin')


read_image (ModelImage, 'gasket/gasket_model')
get_image_size (ModelImage, Width, Height)
read_image (Image, 'gasket/gasket_01')
*2.创建差异模型
create_variation_model (Width, Height, 'byte', 'direct', VariationModelID)
sobel_amp (ModelImage, EdgeAmplitude, 'sum_abs', 3)
*3.直接设参数+标准图像+边缘幅度图像
prepare_direct_variation_model (ModelImage, EdgeAmplitude, VariationModelID, 20, 2)
*4.创建局部变形匹配模板
create_local_deformable_model (ModelImage, 'auto', [], [], 'auto', 0.9, [], 'auto', 0.9, [], 'auto', 'none', 'use_polarity', 'auto', 'auto', [], [], ModelID)
get_deformable_model_contours (ModelContours, ModelID, 1)
area_center (ModelImage, Area, Row, Column)

标准图像:

97665bfc-b28e-11ee-8b88-92fbcf53809c.png

这里由于是用单幅图像创建的差异模型,因此参数Mode设置的’direct’,故不需要再去训练,而是直接使用prepare_direct_variation_model (ModelImage, EdgeAmplitude, VariationModelID, 20, 2)得到差异模型。

通过匹配模板将待检测工件定位矫正

for Index := 1 to 7 by 1
read_image (Image, 'gasket/gasket_' + Index$'02')
get_image_size (Image, Width1, Height1)
*5.查找
find_local_deformable_model (Image, ImageRectified, VectorField, DeformedContours, ModelID, rad(-10), rad(20), 1, 1, 1, 1, 0.93, 1, 0.7, 0, 0.4, ['image_rectified','vector_field','deformed_contours'], ['deformation_smoothness','expand_border','subpixel'], [25,0,1], Score, Row, Column)
if (|Score| > 0)
gen_warped_mesh_region (VectorField, MeshRegion, 25)
gen_region_contour_xld (DeformedContours, EdgeRegion, 'margin')
dilation_circle (EdgeRegion, RegionDilation, 2 * 25)
intersection (RegionDilation, MeshRegion, RegionIntersection)
dev_set_line_width (1)
dev_set_color ('yellow')
dev_display (Image)
dev_display (RegionIntersection)
Found[Index] := |Score|
dev_set_line_width (2)
dev_set_color ('green')
dev_display (DeformedContours)
* 7.注意:这里显示的是修正过的图像  
dev_display (ImageRectified)
endif

待检测图像:

9777b85c-b28e-11ee-8b88-92fbcf53809c.png

局部变形匹配定位:

978f24a6-b28e-11ee-8b88-92fbcf53809c.png

97b6d1fe-b28e-11ee-8b88-92fbcf53809c.png

由于局部变形模板匹配在寻找到图像(find_local_deformable_model)后是自动矫正的,因此我们可以省掉仿射变换的步骤了。

通过差异模型差分得到缺陷工件

*6.差分
compare_variation_model (ImageRectified, Region, VariationModelID)
connection (Region, ConnectedRegions)
*缺陷提取(特征选择,即面积大于60的定义为缺陷)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 60, 99999)
count_obj (SelectedRegions, Number)
*显示
if(Number>0)          
disp_message (WindowHandle, 'NG', 'image', 12, 12, 'red', 'false')
else           
disp_message (WindowHandle, 'OK', 'window', 12, 12, 'magenta', 'false')
endif   
dev_set_color ('red')
dev_display (SelectedRegions)
stop()
endfor
dev_update_on ()

97c9c886-b28e-11ee-8b88-92fbcf53809c.png

相关算子分析:

create_local_deformable_model(创建局部变形匹配模板)

create_local_deformable_model(Template , NumLevels, AngleStart, AngleExtent, AngleStep, ScaleRMin, ScaleRMax, ScaleRStep, ScaleCMin,ScaleCMax, ScaleCStep, Optimization, Metric, Contrast, MinContrast, ParamName, ParamValue ,ModelID)


参数列表:
Template  //输入多通道图像,用来创建model
NumLevels //金字塔层数:'auto', 0,1,2,3,。。。
AngleStart //输入起始角度(默认-0.39)
AngleExtent//角度旋转的范围(默认0.79)
AngleStep //旋转的步长,即分辨率,默认’auto'
ScaleRMin//行方向的最小缩放比例,默认1.0,通常大于0小于1
ScaleRMax//行方向的最大缩放比例,默认1.0,通常大于1小于1.5
ScaleRStep//行方向的缩放步长,可影响行方向的分辨率,默认'auto', 0.01,0.02,0.05,。。
ScaleCMin//
ScaleCMax//          列方向,同上
ScaleCStep//
Optimization//生成模型时的优化方式,默认'none'可选,'auto','point_reduction_XXX'
Metric//比较时候的标准,默认'use_polarity'使用极坐标系进行比较
Contrast//在模板图片的滤波或者磁滞滤波中,控制结果的对比度,默认'auto', 10, 20....
MinContrast//在搜寻对象过程中的最小对比度,默认'auto', 1, 2, 3, 5....
ParamName// 普通参数名字(不太清楚用途,后续研究)默认[], 'min_size','part_size'
ParamValue//参数值, 默认[], 可选'small', 'medium', big'
ModelID// 输出的模型handle

变形检测用来检测一个对象是否局部变形,这个检测模型在保持严格的基础上允许一些细小的变形,和find_shape_model(在图中找到相应图形的最佳匹配)不同,create_local_deformable_model更加智能化,它可以预估变形程度并且修正图像中物体的位置(物体相对于图像的相对位置),它可以处理更大的变形。

get_deformable_model_contours(得到局部变形模板的轮廓)

get_deformable_model_contours( ModelContours , ModelID, Level )
//Level决定了返回第几层金字塔图像的边缘

find_local_deformable_model (在待匹配图像中寻找变形模板)

find_local_deformable_model(Image ,ImageRectified, VectorField, DeformedContours : ModelID, AngleStart, AngleExtent, ScaleRMin, ScaleRMax, ScaleCMin, ScaleCMax, MinScore, NumMatches, MaxOverlap, NumLevels, Greediness, ResultType, ParamName, ParamValue : Score, Row, Column)


参数列表:
Image //输入待匹配图像
ImageRectified //输出匹配到的变形矫正后模板图像
VectorField//变形矢量区
DeformedContours //匹配到的轮廓,不是矫正后的轮廓
ModelID//模型句柄
AngleStart//起始角度
AngleExtent//角度范围
ScaleRMin//行缩放最小比例
ScaleRMax//行缩放最大比例
ScaleCMin//
ScaleCMax//列同上
MinScore//最小相似度
NumMatches//需要几个最佳匹配结果
MaxOverlap//最大重叠数
NumLevels//金字塔层数
Greediness//贪婪度(范围0-1,0表示精确缓慢,1表示迅速精度不高)
ResultType//输出的结果类型([], 'deformed_contours', 'image_rectified', 'vector_field')
ParamName//参数名称
Score//输出匹配度
Row, Column//输出行列坐标

这个函数的功能是在一张图片中找到变形模型中的最佳匹配结果(可以是多个,由NumMatches输入),模型必须在之前的步骤中使用(create_local_deformable_model或者read_deformable_model)生成。这个函数会返回找到的结果的行,列坐标(Row, Column)作为输出。

另外函数在找到匹配的模型后,输出矫正后的图像(ImageRectified),向量区域(VectorField)和匹配到的轮廓(DeformedContours)通过参数ResultType去选择需要返回哪个(默认[],都不返回)。

ParamName可以调整参数的设置:

  • deformation_smoothness:平滑的度,对于变形越大参数越大

  • expand_border:扩大ImageRecfified VectorField 区域

gen_warped_mesh(生成变形网格,封装函数)

97da07d2-b28e-11ee-8b88-92fbcf53809c.png


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器视觉
    +关注

    关注

    161

    文章

    4046

    浏览量

    118377
  • 模板
    +关注

    关注

    0

    文章

    106

    浏览量

    20479
  • 深度学习
    +关注

    关注

    73

    文章

    5239

    浏览量

    119927

原文标题:模板变形后如何进行缺陷检测

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如图,无线充电如何进行充电检测?求探讨原理。

    如图,无线充电如何进行充电检测?求探讨原理。
    发表于 06-14 21:45

    机器视觉表面缺陷检测技术

    影响检测结果的准确性,实现能更好更精确地进行表面缺陷检测,更加快速的识别产品表面瑕疵缺陷。产品表面缺陷
    发表于 01-20 10:29

    柔性印刷线路板缺陷检测方法指南

    缺陷精度要求更高,检测样板尺寸更大,样板成像易变形,使得针对PCB板的缺陷检测算法不能直接套用FPC板的
    发表于 11-21 11:11

    何进行电源检测

    你好,希望这是直截了当的问题,直截了当地回答。电源检测是如何进行的?是否有某种类型的中断可以被检测到?当做,罗恩
    发表于 10-16 09:57

    Vision视觉助手进行有无检测案例实际算法设置分析

    存同时在角度偏移角度图1-5:特征区域面积较大根据检测需求,我们可利用图像中间区域的特征部分作为定位目标建立坐标系,利用模板匹配进行4个特征区域的有无,角度,面积过大或过小等缺陷
    发表于 08-16 18:04

    请问如何进行ATmega168的掉电检测

    何进行ATmega168的掉电检测
    发表于 11-13 07:19

    何进行PET瓶缺陷检测系统的设计?

    为什么要设计一种PET瓶缺陷检测系统?怎样去设计PET瓶缺陷检测系统?有哪些步骤需要遵循?
    发表于 04-15 06:06

    表面检测市场案例,SMT缺陷检测

    偏移、金属件断脚、连接器变形、水晶极性反、撞落等缺陷,这些缺陷如果由人工进行检测,就会速度慢且检出率不高。尤其对于体积很小的电路板,更会加大检测
    发表于 11-08 14:28

    何进行Strong手机模板首页默认风格配置的教程免费下载

    本文档的主要内容详细介绍的是如何进行Strong手机模板首页默认风格配置的教程免费下载。
    发表于 07-01 08:00 0次下载
    如<b class='flag-5'>何进行</b>Strong手机<b class='flag-5'>模板</b>首页默认风格配置的教程免费下载

    通过外观缺陷视觉检测系统来对饮料瓶进行外观缺陷检测

    ,就能够很好的解决这个难题。 那么,饮料瓶的外观缺陷是如何进行视觉检测的呢?下面国辰机器人就来为大家介绍一下。 常见的饮料瓶缺陷能够影响饮料瓶的质量,例如:高盖,盖歪,盖破裂,没有覆盖
    发表于 10-23 14:09 873次阅读

    机器视觉如何进行铝材表面缺陷检测

    的实时监控、在线预警、缺陷分析、成品分级等需求,采用机器视觉辅助或代替人工已是大势所趋。那么机器视觉是如何进行铝材表面缺陷检测的呢?国辰机器人带你一探究竟。
    发表于 05-11 16:29 1388次阅读

    折叠缺陷检测提取算法

    锻件折叠缺陷主要是由于在锻造的过程中,金属发生部分氧化、局部金属发生变形、金属原材料不均匀等导致金属内部发生疲劳破坏,对于管接头锻造件表现为圆柱面产生较大裂缝。在检测系统中,折叠缺陷
    的头像 发表于 09-19 16:26 903次阅读

    温湿度记录仪如何进行维护检测?

    温湿度记录仪如何进行维护检测?
    的头像 发表于 01-13 10:24 878次阅读
    温湿度记录仪如<b class='flag-5'>何进行</b>维护<b class='flag-5'>检测</b>?

    何进行图像边缘的检测

      本期我们一起看看如何进行图像边缘的检测。边缘检测通常用于理解图像中的对象,帮助机器做出更好的预测。编写边缘检测程序是了解机器如何看待外界的好方法。现在就让我们使用python
    的头像 发表于 06-20 15:14 745次阅读
    如<b class='flag-5'>何进行</b>图像边缘的<b class='flag-5'>检测</b>

    基于Halcon图像处理的表面缺陷检测方案

    本文采用Halcon图像处理软件来搭建工业标签表面缺陷检测检测系统,主要检测过程为:利用工业相机对传送带上待检的工业标签进行图像采集和预处
    发表于 07-13 12:19 864次阅读
    基于Halcon图像处理的表面<b class='flag-5'>缺陷</b><b class='flag-5'>检测</b>方案