引言

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

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


模板匹配(定位)+差分

整体思路(形状匹配):

  1. 先定位模板区域后,求得模板区域的坐标,创建物品的形状模板create_shape_model,注意把模板的旋转角度改为rad(0)和rad(360)。
  2. 匹配模板find_shape_model时,由于物品的缺陷使形状有局部的改变,所以要把MinScore设置小一点,否则匹配不到模板。并求得匹配项的坐标。
  3. 关键的一步,将模板区域仿射变换到匹配成功的区域。由于差集运算是在相同的区域内作用的,所以必须把模板区域转换到匹配项的区域。
  4. 之后求差集,根据差集部分的面积判断该物品是否有缺陷。

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

halcon例程分析:


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


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

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

  1. create_variation_model —— 创建一个差异模型
  2. get_variation_model —— 获得差异模型
  3. train_variation_model —— 训练差异模型
  4. prepare_variation_model —— 准备差异模型
  5. compare_variation_model —— 比较模型与实例
  6. 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特征筛选的标准

相关算子分析:

  • 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)

标准图像:

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

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

待检测图像:

局部变形匹配定位:                                                                        矫正:

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

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

    *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 ()

相关算子分析:

  •  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可以调整参数的设置:(比如)
  1. deformation_smoothness:平滑的度,对于变形越大参数越大
  2. expand_border:扩大ImageRecfified VectorField 区域
  • gen_warped_mesh(生成变形网格,封装函数)
gen_warped_mesh (VectorField, WarpedMesh, 10)

VectorField// 输入向量区域
WarpedMesh//输出变形网格
10 //代表此函数隔10个像素取值

halcon——缺陷检测常用方法总结(模板匹配(定位)+差分)的更多相关文章

  1. halcon——缺陷检测常用方法总结(测量拟合)

    引言 机器视觉中缺陷检测分为一下几种: blob分析+特征 模板匹配(定位)+差分:halcon--缺陷检测常用方法总结(模板匹配(定位)+差分) - 唯有自己强大 - 博客园 (cnblogs.co ...

  2. halcon——缺陷检测常用方法总结(特征训练)

    引言 机器视觉中缺陷检测分为一下几种: blob分析+特征 模板匹配(定位)+差分:halcon--缺陷检测常用方法总结(模板匹配(定位)+差分) - 唯有自己强大 - 博客园 (cnblogs.co ...

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

    引言 机器视觉中缺陷检测分为一下几种: blob+特征(官方示例surface_scratch.hdev) blob+差分+特征(官方示例pcb_inspection.hdev) 光度立体 特征训练 ...

  4. halcon——缺陷检测常用方法总结(频域空间域结合)

    摘要 缺陷检测是视觉需求中难度最大一类需求,主要是其稳定性和精度的保证.首先常见缺陷:凹凸.污点瑕疵.划痕.裂缝.探伤等. 缺陷检测算法不同于尺寸.二维码.OCR等算法.后者应用场景比较单一,基本都是 ...

  5. Halcon编程-基于形状特征的模板匹配

    halcon软件最高效的一个方面在于模板匹配,号称可以快速进行柔性模板匹配,能够非常方便的用于缺陷检测.目标定位.下面以一个简单的例子说明基于形状特征的模板匹配.      为了在右图中,定位图中的三 ...

  6. opencv 在工业中的应用:模板匹配

    模板匹配在工业中经常有两个用途,一模板匹配进行产品定位,二根据匹配度来判断是OK的产品还是NG的产品.我用OPENCV做了个模板匹配定位的DEMO. (1)点击打开图像按钮打开一幅图像 (2)点击定义 ...

  7. halcon 模板匹配(最简单)

    模板匹配是机器视觉工业现场中较为常用的一种方法,常用于定位,就是通过算法,在新的图像中找到模板图像的位置.例如以下两个图像.   这种模板匹配是最基本的模板匹配.其特点只是存在平移旋转,不存在尺度变化 ...

  8. halcon模板匹配

    在机器视觉应用中,经常需要对图像进行仿射变换.1.在基于参考的视觉检测中,由于待检图像与参考图像或多或少都会存在几何变化(平移.旋转.缩放等),所以在做比较之前一般都要对待检图像进行仿射变换以对齐图像 ...

  9. halcon三种模板匹配方法

    halcon有三种模板匹配方法:即Component-Based.Gray-Value-Based.Shaped_based,分别是基于组件(或成分.元素)的匹配,基于灰度值的匹配和基于形状的匹配,此 ...

随机推荐

  1. python 压缩模块大杂烩(zipfile,bz2,lzma,gzip,tarfile,zlib)

    [*] 以下压缩模块请结合python的官方文档(https://docs.python.org/3.5/library/index.html)来实践或者对比(我的是python 3.5) 1.pyt ...

  2. 神经网络与机器学习 笔记—LMS(最小均方算法)和学习率退火

    神经网络与机器学习 笔记-LMS(最小均方算法)和学习率退火 LMS算法和Rosenblatt感知器算法非常想,唯独就是去掉了神经元的压制函数,Rosenblatt用的Sgn压制函数,LMS不需要压制 ...

  3. 【python】Leetcode每日一题-搜索排序数组2

    [python]Leetcode每日一题-搜索排序数组2 [题目描述] 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k( ...

  4. 微信小程序中的加载更多(即列表分页)

    1.app.json中: "window": { "enablePullDownRefresh": true //是否开启当前页面下拉刷新 } 2.wxml中: ...

  5. chemfig化学式转换为pdf

    SMILES 与 chemfig 针对化学分子结构,可以用SMILES (用ASCII字符串明确描述分子结构的规范)来定义. SMILES(Simplified molecular input lin ...

  6. Linux 中如何使用 IP 命令

    老版本的 Linux 中都是使用 ifconfig 命令检查和配置网络接口,但是该命令目前已经没有维护了,取而代之的是 ip 命令 ip 命令和 ifconfig 命令很相似,但是 相比起来,ip命令 ...

  7. 使用FastDFS进行文件管理

    使用FastDFS进行文件管理 FastDFS简介 FastDFS: FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等, ...

  8. VS里的 代码片段(Code snippet)很有用,制作也很简单

    工欲善其事必先利其器,而 Visual Studio 就是我们的开发利器. 上一篇文章,介绍了一个很棒的快捷键,如果你还没用过这个快捷键,看完之后应该会豁然开朗.如果你已经熟练的应用它,也会温故而知新 ...

  9. I/O流以及文件的基本操作

    文件操作: 文件操作其实就是一个FIle类:我们学习文件操作就是学习File类中的方法: 文件基操: 第一部分:学习文件的基本操作(先扒源码以及文档) Constructor Description ...

  10. Linux PATH环境变量及作用(初学者必读)

    Linux PATH环境变量及作用(初学者必读) < 什么是环境变量,Linux环境变量有哪些?Linux打包(归档)和压缩 > <Linux就该这么学>是一本基于最新Linu ...