variation model
变化的模板的主要原理是当前图片与理想的模板图像作对比,算法找出不通过,也就是在实际使用中,印刷缺陷的检测可以使用的varation Model.
理想图片和变化的图片
在这里的理想图片的获取通常是通过一系列OK的图片进行训练而得到的,训练的时候也会允许每个点灰度值的一定变化,这个信息保存在变化的图像中,再通过write_vartion_model保存到文件,理想图片和变化图片都保存在变化的模板variation model中,这个模型就用来与当前获取的图片进行比较。
实现步骤
矫正图片到标准位置
这里的标准位置是我们选择的一个初始位置,用来做训练的图片都需要通过仿射变换到标准位置,在做变化的模板的时候,一定要校准图像到标准位置,那么在使用变化的模板的时候,同样需要把图片校准到标准的图像位置,这个步骤非常重要。
关键算子
area_center 获取模板中心的坐标
create_shape_model创建模板
find_shape_mode查找模板
vector_angle_to_rigid生成一个仿射变换矩阵
affine_trans_image应用一个矩阵到图像,转换图像到标准位置
训练变化的模板
训练变化的模板是使用一系列好的样本进行训练,trainf_variation_model用来训练,训练生成一个理性图片和变化的图片,变化的图像可以理解为像素点公差范围。 在这里也可以用一张图片来进行训练,变化的图像可以使用边缘滤波来得到。
准备和使用模板
如果使用一系列的图片来创建变化的模板,可以使用prepare_variation_model来进行准备,使用compare_variation_model来查找出缺陷,再通过select_shape来选择对应特征的缺陷、判断即可。如果使用一张图片来创建的模板,使用prepare_direct_variation_model来进行准备模板,使用compare_ext_variation_model.
销毁变化的模板
在halcon中,只要在使用create_*这个算子中,就要使用clear_*来进行成对的进行释放资源,否则会造成内存和句柄泄露
例程
训练部分
*提取字符部分
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)
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)
* 清空var model内存
clear_train_data_variation_model (VariationModelID)
处理部分
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, RegionROI, ImageReduced)
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
clear_shape_model (ShapeModelID)
clear_variation_model (VariationModelID)
写到最后,公众号好 VisionManMaster
关注我
閱讀更多 機器視覺工程師 的文章