模型变化主要原理是将一个或多个图像与理想图像进行比较,以发现显著差异。通过比较有缺陷的对象和正常的对象来识别判断生产的对象。理想图像通常是通过使用多个参考图像进行训练而获得。除了理想图像之外,训练还派生出图像中每个点允许的灰度值变换信息。这些信息存储在所谓的变换中,这两个图像都用于创建一个变化模型,与其他图像进行比较。
模型变换优点可以直接通过灰度值对图像进行比较,并通过图像变换进行空间加权。
1 基本概念
模型变换有几个步骤:
1.1 图像获取
获取图像进行训练。
1.2 创建模型变换
模型变换通过算子create_variation_model进行图像比较。该算子存在了以下步骤所需的信息。
1.3 图像或ROI定位
模型变换的训练,所有训练图像必须放置在相同位置和相同方向。因此,在训练模型之前,需要定位对象。与变换模型进行比较也需要定位。
1.4 训练模型
模型变换可以通过提供一组包含的优秀样本的图像进行训练,算子train_variation_model使用训练图像计算出理想图像和模型变化的图像的差异。图像变换表示图像上每一点的灰度值变异量,即差值。
如果想多个图像训练模型,例如考虑到存储,可以使用单个图像作为理想图像,但是需要了解空间分布的边界。如果知道可接受的公差在物体的边缘附件,可以通过对理想图像应用边缘滤波器来创建变换图像。在此过程中,跳过训练步骤。
1.5 准备模型
为比较图像模板变换,将理想图像和图像变换转换为两个阈值图像。如果使用train_variation_model算子训练多个模型,则使用算子prepare_variation_model准备模型。如果使用单个图像作为理想图像,并通过过滤理想图像手动创建相应的变换图像。使用sobel_amp,edges_image或gray_range_rect,则必须使用prepare_direct_variation_model进行准备,是因为理想图像和图像变换并没有连接到模型变换中。
获得阈值图像可以使用算子get_thresh_images_variation_model直接获取。
1.6 比较模型差异
使用算子compare_variation_model将图像与准备好的模型变量进行比较。获得的两个阈值(并存储在模型差异中)来确定包含图像中与模型显著不同的所有点的区域。当使用算子compare_ext_variation_model代替时,可以使用比较扩展参数设置。
2 扩展概念
在比较之前,需要对结果进行可视化显示。
2.1 检测模型质量
用多张图像训练一个模型,可以通过算子get_variation_model查询理想对象的图像和对应图像的差异,检测用于训练的图像是否全部包含类似对象,如果图像差异在应没有边缘的区域中包含了其他差异,可以得出结论,有一个训练图像保护了不需要的特征。
2.2 清理模型数据
在准备好的模型之后,可以通过应用算子clear_train_data_variation_model来减少模型所需的内存。但是,只有当不再需要使用模型进行比较时,才建议使用这方法。删除模型数据后不能够进行的使用算子get_variation_model。
2.3 结果可视化
显示的目标是标记图像中与模型不对应的部分。可以通过连通域进行连通得到区域连通域,然后通过select_shape选择在特定区域范围内的区域来进行显示提取。
2.4 程序示例
read_image(Image,'pen/pen-01')
get_image_size(Image,Width,Height)
gen_rectangle1 (RegionROI, 134.342, 231.317, 200.026, 280.585)
reduce_domain(Image,RegionROI,ImageReduced)
create_generic_shape_model(ShapeModelID)
set_generic_shape_model_param (ShapeModelID, 'contrast_low', 40)
set_generic_shape_model_param (ShapeModelID, 'contrast_high', 50)
train_generic_shape_model (ImageReduced, ShapeModelID)
set_generic_shape_model_param (ShapeModelID, 'min_contrast', 40)
set_generic_shape_model_param (ShapeModelID, 'angle_start', rad(-10))
set_generic_shape_model_param (ShapeModelID, 'angle_end', rad(10))
edges_sub_pix (ImageReduced, Edges, 'sobel_fast', 0.5, 10, 20)
hom_mat2d_identity (HomMat2DIdentity)
hom_mat2d_scale (HomMat2DIdentity, 4, 4, 0, 0, HomMat2DScale)
affine_trans_contour_xld (Edges, ZoomedEdges, HomMat2DScale)
gen_image_const (VarImageBig, 'byte', 4 * Width, 4 * Height)
count_obj (ZoomedEdges, NEdges)
for i := 1 to NEdges by 1
select_obj (ZoomedEdges, ObjectSelected, i)
get_contour_xld (ObjectSelected, RowEdge, ColEdge)
gen_region_polygon (Region1, RowEdge, ColEdge)
dilation_circle (Region1, RegionDilation, 2.5)
paint_region (RegionDilation, VarImageBig, VarImageBig, 255, 'fill')
endfor
zoom_image_size (VarImageBig, VarImageSmall, Width, Height, 'weighted')
binomial_filter (VarImageSmall, VarImage, 3, 3)
create_variation_model (Width, Height, 'byte', 'direct', VarModelID)
prepare_direct_variation_model (Image, VarImage, VarModelID, 15, 4)
琐碎时间阅读基础知识,详情关注微信公众号“知识代码AI”。