一、差分模板

这个示例程序展示了如何使用 HALCON 的变分模型算子执行典型的打印质量检查。程序检测在笔夹上的不正确打印。该程序类似于程序 print_check.hdev。主要区别是每个字符都是单独检查的。

差分未必是特别好的策略,因为它不检测笔夹本身的错误以及由于 V 相对移动而导致的错误到其他字符。然而,在某些应用中,正是这个不变性很有用。这个程序可以用作这样的基础应用程序。

检查步骤:第一步,每个字符的变异模型是由正确打印的图像构成。由于物体的位置可以不同,不同角色的图像必须转换为参考position(角色在变体模型中的位置)。的位置模型中的字符是通过选择第一张图像的一部分给出的从第一张图像到字符和字符周围的缓冲区。

仿射变换operator affine_trans_image_size 用于有效地执行此任务。

HALCON 的基于形状的匹配用于检测每个人的位姿一次调用 find_shape_models 时图像中的字符。发现的姿势用于将不同角色的图像转换为他们的各自的参考位置。

在程序的第二部分,打印对正确剪辑和几个不正确剪辑进行检查和分类。

二、基于变化模型匹配原理

Variation Model 的主要原理是将待检测的图像与一张标准图像作比较,找出待检测图像与标准图像 (idealimage)的明显差异(也就是不良)。标准图像可以采用几张OK品的图像训练(training)得到 ,也可以通过对一张OK品图像进行处理得到。

训练后得到标准图像和一张variation图像(variationimage),variation图像中包含了图像中每个像素点灰度值允许变化的范围。标准图像和variation图像用来创建一个variationmodel ,如此,其他图像就可以与variationmodel作比较了。

三、算法步骤

应用场合:搜索对象有轻微的变形。

1.创建模板:create_variation_model()

2.准备和训练模型:

prepare_variation_model()

train_variation_model()

3.比较模板:compare_variation_model()

4.释放模板: clear_variation_model()

四、算子解释

4.1 算子:create_variation_model( : : Width, Height, Type, Mode : ModelID)

输入参数:width、Height是模板和待检测图像的尺寸。
输入参数:Type,是图像的类型。
输入参数:Model,决定如何计算idealimage和variationimage,其有三种模式

  • 1、standard,该模式下,可以使用算子train_variation_model对多张图片进行迭代训练,此时ideal image是通过计算多张图片的平均值获得,variation image是通过计算多张图片的标准方差获得。该模式的优点是可以迭代计算多张good image,缺点是在训练图片时,一旦有不良的图片混入会导致算法检测时出现误判。

注意:在训练多张图片时,每张图片的位置、角度都必须一致,可使用基于形状匹配来进行定位处理,然后在进行训练train_variation_model,

  • 2、'robust',如果在训练多张图片时,无法避免训练的图片中出现晓得下次,可以使用该模式。此时,ideal image时通过计算多张图片的中值获得,variation image也是通过计算多张图片中值获得。该模式的优点是鲁棒性更强,缺点是无法进行迭代预算。

注意:训练多张张图片时,每张图片的位置、角度必须一致,然后使用concat_obj将图片组合起来,在使用train_variation_model进行训练。
以上两种模式下,训练完图片后只能使用prepare_variation_model算子准备用于图像比较的模板。

  • 3、 'direct',该模式下,可以使用一张图片训练,并不需要使用train_variation_model训练模板,但只能使用prepare_direct_variation_model准备模板,并且prepare_direct_variation_model中的RefImage,就是模板图像,而 VarImage必须通过其他边缘算子生成如,sobel_amp,edges_image, or gray_range_rect.,或者自己制造一个边缘(见Halcon12例程variation_model_single)

4.2 算子:prepare_variation_model( : : ModelID, AbsThreshold, VarThreshold : )
prepare_direct_variation_model(RefImage, VarImage : : ModelID, AbsThreshold, VarThreshold : )

这两个算子的作用是准备用于比较图片的模板,其不同在上文已说明。
输入参数:ModelID,训练或生成的模板。
输入参数: AbsThreshold,绝对阈值。
输入参数: VarThreshold 相对阈值。
AbsThreshold, VarThreshold 可以分别有一个值,也可以分别有两个值。当都只有一个值的时候,亮暗缺陷都是其决定的。
i(x,y)表示ideal image灰度值,v(x,y)表示variation image灰度值,c(x,y)表示待检测图片的灰度值,a=AbsThreshold,b=VarThreshold
当c(x,y)>i(x,y)+ max{a,b*v(x,y)}为亮缺陷。
当c(x,y)<i(x,y)- max{a,b*v(x,y)}为暗缺陷。
当AbsThreshold,VarThreshold有两个值时,第一个值决定亮缺陷,第二个值决定按缺陷。
i(x,y)表示ideal image灰度值,v(x,y)表示variation image灰度值,c(x,y)表示待检测图片的灰度值,AbsThreshold=[a1,a2],VarThreshold =[b1,b2]
当c(x,y)>i(x,y)+ max{a1,b1*v(x,y)}为亮缺陷。
当c(x,y)<i(x,y)- max{a2,b2*v(x,y)}为暗缺陷。

4.3 算子 train_variation_model(Images : : ModelID : )

该算子输入一堆好图像和模板句柄。导致模板内参数有变化:生成标准图+差分图。

4.4 算子:compare_variation_model(Image : Region : ModelID : )

输入参数:Image,该图像为待检测图像,需要注意的是,该图像也必须与模板图像对齐。
输出参数:Region,检测出来的区域。
输入参数:ModelID,准备好的模板ID。

4.5 算子: compare_ext_variation_model(Image : Region : ModelID, Mode : )

该算子是算子compare_variation_model的拓展,其参数 MODE可以控制输出暗或亮缺陷或者都输出。

五、参考代码

dev_update_off ()
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)
* Note: the shape model will be constructed from a ROI that is computed
* automatically based on a simple image segmentation.
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 1read_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)
* We can now free the training data to save some memory.
clear_train_data_variation_model (VariationModelID)
* Note: the checking of the print will be restricted to the region of the clip.
* Sometimes the print is also in an incorrect position of the clip.  This will lead
* to erroneous regions at the top or bottom border of the clip and hence can
* be detected easily.
erosion_rectangle1 (RegionFillUp, RegionROI, 1, 15)
dev_display (MeanImage)
set_tposition (WindowHandle, 20, 20)
dev_set_color ('green')
write_string (WindowHandle, 'Reference image')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_display (VarImage)
set_tposition (WindowHandle, 20, 20)
dev_set_color ('green')
write_string (WindowHandle, 'Variation image')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_set_draw ('margin')
NumImages := 30
for I := 1 to 30 by 1read_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')elsedev_set_color ('red')write_string (WindowHandle, 'Clip not OK')endifendifif (I < NumImages)disp_continue_message (WindowHandle, 'black', 'true')stop ()endif
endfor
clear_shape_model (ShapeModelID)
clear_variation_model (VariationModelID)

halcon知识:差分模板variation_model相关推荐

  1. halcon知识:圆度和紧凑度

    一.说明 本文是halcon知识:select_shape究竟怎么用(1)的继续,关于select_shape的用途说的还不够,因为这些属性很多,有必要分开介绍. 二.圆度和紧凑度的直观演示 2.1 ...

  2. 焚风现象(差分模板题)

    焚风现象 https://loj.ac/problem/2332 IOI 王国永远刮着海风.风从地点 000 依次吹到地点 111,地点 222 --直到地点 NNN,共 N+1N+1N+1 个地点. ...

  3. 防诈骗安全教育宣传防诈骗知识PPT模板

    模板介绍 精美PPT模板设计,防诈骗安全教育宣传防诈骗知识PPT模板.一套安全教育幻灯片模板,内含红色多种配色,精美风格设计,动态播放效果,精美实用. 一份设计精美的PPT模板,可以让你在汇报演讲时脱 ...

  4. 青少年心理健康知识PPT模板

    模板介绍 精美PPT模板设计,青少年心理健康知识PPT模板.一套心理健康幻灯片模板,内含蓝色多种配色,精美风格设计,动态播放效果,精美实用. 一份设计精美的PPT模板,可以让你在汇报演讲时脱颖而出. ...

  5. 图像处理HALCON中的模板匹配方法总结

    HALCON中的模板匹配方法总结 摘要 1. Shape-Based matching的基本流程 2. 基于形状匹配的参数关系与优化 摘要 德国MVTec公司开发的HALCON机器视觉开发软件,提供了 ...

  6. halcon知识:常见三种模板匹配方法总结

    目录 一. 形状匹配模板( Shape_Based ) 1.1 形状匹配常见的有四种情况 1.2 四种匹配的特点 1.3 一般形状匹配模板shape_model 1.4 线性变形匹配模板planar_ ...

  7. halcon知识:ncc_model模板匹配

    说明 除了常见的模板匹配之外,还有其它模板匹配,虽然不够主流,但尝试使用,也能解决许多问题.这里先说明ncc_model模板. 一.基于互相关匹配 一种基于灰度值的方法是基于相关的匹配.这种方法使用归 ...

  8. halcon三种模板匹配方法

    转自 : http://blog.csdn.net/hust1900/article/details/8843270 halcon有三种模板匹配方法:即Component-Based.Gray-Val ...

  9. halcon知识:图像纹理特征提取cooc_feature_matrix

    一.关于共生矩阵 如果不懂啥叫共生矩阵,将无法阅读该文.如果试图搞明白啥叫共生矩阵,请看我的另一篇博文,<hjalcon知识:共生矩阵> 本片介绍共生矩阵产生的其它属性:能量.相关性.同质 ...

最新文章

  1. 卓越的TurboGate邮件网关企业邮箱的安全保障
  2. 视频播放的方法Android,详解Android App中使用VideoView来实现视频播放的方法
  3. Junit 多线测试 问题
  4. C++将“引用”作为函数返回值类型的格式、好处和注意事项?
  5. gruntjs开发实例
  6. mysql如何重复_mysql 处理重复数据
  7. 微软警告 Windows 10 1703 即将停止支持!
  8. 数据抽取工具——DMCTextFilter V4.2(纯文本抽出通用程序库)
  9. 基于matlab的二元幅值光栅设计程序
  10. 多线程小题 —— 设计火车票模拟程序
  11. Python实现k均值聚类算法_K-Means聚类算法
  12. dimm和udimm_RDIMM和UDIMM内存的区别
  13. Linux学习——编辑器Vim学习
  14. 学习编程是否真的有用?
  15. linux的命令名必须是小写英文字母,Linux常用命令及操作
  16. 在C#中使用OpenCV(使用OpenCVSharp)
  17. 未来的计算机也无法突破冯诺依曼结构,冯诺依曼计算机的基本原理
  18. Ensight导入Fluent h5瞬态序列文件
  19. 新的一年里,愿你所有的愿望都能实现
  20. BoxCutter:阵列

热门文章

  1. 深度学习核心技术精讲100篇(四十一)-阿里飞猪个性化推荐:召回篇
  2. FastText情感分析和词向量训练实战——Keras算法练习
  3. 深度学习核心技术精讲100篇(十七)-多标准中文分词( Multi-Criteria-CWS)
  4. 完美解决mysql下utf-8的乱码问题
  5. 【云计算】_8云视频与通信服务(完结)
  6. python pandas加速包
  7. Redis BitMap适应场景
  8. 主流的Python领域和框架--转
  9. 快速定位java系统的线上问题--转
  10. 一些让人受益匪浅的话--转