如果需要了解其他图像处理的文章,请移步小编的GitHub地址

  传送门:请点击我

  如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice

  VisionPro有很多的示例和算子,这里再展示一个最新出的算子Pat Inspect Tool。我自己的笔记不会按照顺序一一展示出来的,也许那个文章先OK,我会先release出来的。 其中大部分的图片和步骤都是VisionPro的官方文档,我这里只是自己的学习笔记,不做任何商用。

  首先,我们可以看一下VisionPro的新功能,如下图所列:

  他们新增了PatInspect工具,主要是将图像的特征与训练图像的特征进行比较,并生成突出显示他们之间差异的输出图像。输出图像突出显示输入图像中的潜入特征。例如缺陷或未对齐的特征,对象上的错误或不需要的标记,或错误颜色的表面

   下面通过一个示例来学习一下。

1:使用PatInspect查找缺陷的原理

  例如,下图显示训练图案、输入图像的区域以及由 PatInspect 工具生成的输出图像:

  然后,可以使用其他视觉工具(如斑点工具或直方图工具)分析输出图像,以收集有关潜在缺陷的更多信息。

  下面按照步骤展示一下这个工具如何使用:

1.1 训练图案

  PatInspect 工具将运行时图像的一个区域与训练图案进行比较,以定位潜在的缺陷。

  在使用 PatInspect 工具分析运行时图像之前,必须首先创建训练图案,该图案与其他配置参数一起存储。

  使用统计训练方法,您可以使用要通过视觉应用程序检查的对象的实际图像来创建训练图案。从多个图像创建训练图案允许您构建这样的训练图案:即可以补偿被检查对象的背景内和反射的运行时图像中允许的照明变化。图像可以存储在图像数据库文件中,也可以从生产环境中采集实时图像。在任何一种情况下,用于创建训练图案的训练图像必须与您期望在视觉应用程序运行时采集的图像非常相似,包括背景、照明和对象放置。此外,图像必须没有缺陷,以便它们生成训练有图案,代表您的视觉应用程序将检查的对象的理想示例。

  为了创建训练图案,PatInspect 工具接受训练图像并将其平均处理为当前训练图案(如果存在),使用下图所示的公式:

  尽管可以从单个训练图像创建训练图案,但使用多个图像构建的训练图案可以补偿运行时图像中允许的光照变化和对象放置的微小变化。只有当您的生产环境可以保证光源一致并且被检查对象的外观永远不会发生允许的变化时,才应该从单个图像生成训练图案。

  可用于创建训练图案的图像数量没有上限,尽管随着您添加的每个图像,图案的变化会越来越小。

 

1.2 标准偏差图像

  使用训练图案 PatInspect 工具生成标准偏差图像,其中每个像素是统计训练图像中像素值标准偏差的度量。标准偏差图像是训练图案中每个像素的预期可变性程度的指示。

  PatInspect 工具使用下图所示的公式生成标准偏差图像:

  如果您使用单个输入图像创建训练图案,则 PatInspect 工具使用 Sobel 边缘工具(后面会单独讲Soble工具)生成伪标准偏差图像,其中较亮的像素表示特征之间的预期边界。例如,下图是一个训练图案及其生成的伪标准差图像:

  使用该工具支持的缩放和偏移系数值,您可以更改伪标准偏差图像中的信息。增加缩放系数会增加图像边缘的大小,而增加偏移系数会增加图像的整体亮度。如果 PatInspect 工具一直报告运行时图像的轮廓或边框存在错误缺陷,请尝试调整 Sobel 系数值。

  如果使用统计训练方法创建训练图案,则更改 Sobel 系数值不会产生任何效果。

 

1.3 阈值图像

  对于用于创建训练图案的每个输入图像,PatInspect 工具会重新计算标准偏差图像,然后使用当前标准偏差图像生成阈值图像。下图是一个训练图案及其生成的阈值图像:

  PatInspect 工具使用下图所示的公式生成阈值图像:

  其中 AB 分别代表缩放系数和偏移系数。增加阈值缩放会增加边缘信息的对比度,而增加阈值偏移会增加整体亮度。如果 PatInspect 工具在运行时图像的大面积上始终报告错误缺陷,请尝试调整阈值系数值。

  PatInspect 工具使用阈值图像来确定是否应将运行时图像中的任何像素视为缺陷像素。

1.4 图像归一化

  PatInspect 工具对光照变化非常敏感。即使环境光水平的微小变化也会导致工具将运行时图像中的较亮或较暗像素视为缺陷。为了补偿不同的光照水平,该工具可以在分析差异之前对运行时图像执行图像归一化操作。图像归一化可以将非缺陷像素的值降低或提高到与存储在训练图案中的相同水平。

  在配置 PatInspect 工具时,您必须选择以下图像归一化类型之一:

1.5 PatInspect 分析

  为了分析运行时图像,该工具首先计算匹配图像,这是该工具将与训练图案进行比较的运行时部分。匹配图像由您选择的训练区域的形状确定。

  接下来,该工具对匹配图像进行图像归一化操作,然后生成原始差异图像(如下图所示),作为训练图案与匹配图像之间的绝对差异:

  然后,该工具将阈值图像的每个像素与原始差异图像进行比较。如果原始差异图像中的像素值大于阈值图像的对应像素值,则从原始图像像素中减去当前偏移值(单个图像图案的 Sobel 偏移或统计训练图案的阈值偏移)并将结果(不小于 0)存储在阈值差分图像中。如果原始差异图像中的像素值小于阈值图像的对应像素值,则将值 0 存储在阈值差异图像中。例如,下图显示了原始差异图像、阈值图像和 PatInspect 工具生成的没有偏移值的阈值差异图像:

  您可以将此阈值差异图像传递给其他视觉工具,如斑点工具或直方图工具,以生成有关运行时图像中存在的缺陷数量和类型的更多信息。

1.6 用于对齐的PMAlign 工具

  在许多视觉应用中,被检查对象的位置可能会在一次检测之间发生位置、旋转或缩放变化。如果姿势(当训练图案与运行时图像进行比较时对象如何映射的描述)随着每次检查而变化,该工具可以轻松检查图像的错误区域并返回许多错误结果。

  在执行分析和生成结果之前,PatInspect 工具无法执行任何类型的区域对齐。为了确保 PatInspect 工具将区域放置在每次检查的运行时图像的正确区域中,另一个视觉工具必须首先定位对象并将其姿势报告给 PatInspect 工具。PMAlign 工具非常适合此任务,Cognex 建议您在使用 PatInspect 工具之前使用带有 PatMax 算法的 PMAlign 工具来定位对象。PMAlign 工具的姿势可以直接传递到 PatInspect 工具,确保 PatInspect 工具为每次检查分析正确的图像区域。

  此外,也可以使用固定工具,将姿势信息从 PMAlign 工具传递到固定工具的固定参数,然后使用固定工具生成的输出图像作为 PatInspect 工具的输入图像。

  无论是单独使用 PMAlign 工具还是将 PMAlign 工具与固定工具组合使用,都必须确保 PMAlign 原点与 PatInspect 原点保持同步。否则,在执行统计培训或检查时,PatInspect 工具将无法正确放置其区域。

1.7 插值模式

  PatInspect 工具支持两种插值模式:双线性和兼容性。默认情况下,该工具使用双线性模式,适用于大多数应用程序。此外,您必须使用选择双线性模式来利用多核 PC。非默认模式兼容性可用于使用 PatInspect 工具的旧应用程序。

 

2:PatInspect的官方示例程序

  PatInspect 工具将输入图像区域内包含的特征与训练模式中存储的特征进行比较,并生成突出显示它们之间差异的输出图像。 输出图像突出显示输入图像中的潜在缺陷 - 缺失或未对齐的特征、物体上的错误或不需要的标记或颜色错误的表面。

  例如,下图显示了经过训练的模式、输入图像的区域以及 PatInspect 工具生成的输出图像:

  由于许多视觉应用程序都具有受检查对象的特征,其中感兴趣的特征可能会从一幅图像更改为另一幅图像的位置,因此此示例应用程序从 PMAlign 工具开始,以定位可靠的特征,并使用结果生成固定的坐标空间来定位 PatInspect 工具 。 有关将视觉工具放置在固定坐标空间上的好处,请参阅创建固定坐标空间主题。

   所以下面在VisionPro的官方QuickBuild里面建立一个完整的示例来学习一下Pat Inspect Tool。以下过程创建一个应用程序,该应用程序使用 PMAlign 工具在 PatInspect 工具分析之前报告对象的姿势。

step1:启动 QuickBuild 并配置新应用程序以从连接的相机或图像数据库获取图像

  此示例应用程序使用工具包的图像数据库以及从生产环境捕获的示例图像。

  关于获取图像,我这里再啰嗦一下,常见的获取图像有两种方法:1,直接使用摄像头在生产环境中获取图像;2,使用采集好的数据图库。 当然,无论哪种方式都取决于你的需求。

  下图是QuickBuild获取到的图像展示:

 

step2:创建一个ToolBlock,添加PMAlign工具并将ToolBlock的输入图像连接到PMAlign工具的InputImage

  我们需要运行 ToolBlock,将图像数据库中的第一个图像传递给 PMAlign 工具(PMAlign工具是用来做定位的工具,这个我们后面会介绍,也是VisionPro中不可缺少的一个常用工具)。

  如下图所示,我们添加了PMAlign工具和Inputs的输入图像连接,一般情况下,当运行报错(即显示红色),要么是加载的图像有问题,要么就是工具需要的是灰度图,而我们导入了RGB图像,要么就是工具需要的是RGB图像,我们导入了灰度图(解决方法也很简单,图像有问题,更换图像即可;后面两种情况,我们只需要接入ImageConvertTool,这个工具前面博客已经介绍了)。

step3:循环浏览图像数据库,直到找到代表工具包的图像,并且所有组件都位于所需位置

  其实这一步骤主要是观察图像的特征,从我们个人的理解,查看图像中某一个位置是不容易改变的。我们需要通过这个位置进行定位。意思是来确定整个产品的方位。

  如下图所示,我们决定圈圈的地方是我们定位的地方,当然这个位置也是仁者见仁智者见智,自己选自己认为合适的即可。

step4:配置 PMAlign 工具以在所有图像中定位特征常量。 应用程序使用原点在后续步骤中创建固定坐标空间

  下图就是定位了指定区域,通过定位区域来获取图像的位置。

此应用程序启用“比例”参数以及低和高比例更改的默认值:

step5:在图像数据库的所有图像上运行 ToolBlock,并验证 PMAlign 工具在每个图像中找到所需的特征

  注意,如果找不到该功能,则应用程序将失败。 根据需要调整搜索区域或其他运行参数以在所有图像中查找该特征,或选择另一个特征供 PMAlign 工具定位。 所以我之前说定位的位置自己随便选,选择自己认为合适的即可。

step6:将 Fixture 工具添加到 ToolBlock 中,并将图像数据库中的 InputImage 与 PMAlign 工具找到的特征的姿势连接起来

  如下图所示,这是链接的示例,当然你也可以按照这个步骤进行操作。

  Fixture 工具的 OutputImage 提供具有相对于 PMAlign 工具找到的特征的坐标空间的图像,并允许 PatInspect 工具检查每个运行时图像的所需部分。

step7:添加 PatInspect 工具并为其提供 Fixture 工具的 OutputImage

  这里主要是添加本文的主角,PatInspect工具。

step8:打开 PatInspect 编辑控件,进行编辑

  单击“抓取训练图像和原点”将 Current.InputImage 复制到 Current.TrainImage 缓冲区。

  切换到 Current.TrainImage 缓冲区。 本地图像窗口显示相同的输入图像,但现在出现默认的感兴趣区域:

  我们调整要测试的感兴趣区域,调整后如下所示:

  如下图所示,我们选择三角形作为PatInspect工具的模板图像。单击 PatInspect 编辑控件上的“训练新模式”以创建经过训练的模式。 编辑控件在“训练参数”选项卡上显示训练后的模式:

  PatInspect 工具现在具有经过训练的模式来检查这些工具包的连续运行时图像。如果单击 PatInspect 编辑控件上的“运行”按钮,该工具会将 Current.InputImage 与经过训练的模式进行比较。在获取不同的图像之前,LastRun.DifferenceImageAbsolute 缓冲区不会显示结果。

  在此示例应用中,套件上的照明可以变化,并且套件本身内的各个对象的位置可以放置在某个小的公差范围内。 PatInspect 工具需要一个训练有素的模式来解释运行时图像中这些允许的差异。

  我们可以再次运行 ToolBlock,直到获得另一张图像,其中照明已发生变化,或者包含所有组件的套件出现在略有不同的位置。我们可以返回到 PatInspect 编辑控件并注意新的 Current.InputImage。 单击统计训练当前模式将新图像合并到现有的训练模式中。 “运行参数”选项卡的“训练模式图像”窗口中的训练模式看起来略有不同,编辑控件会更新分析图像的数量以创建此训练模式:

  意思是多增加几张训练图像,尽量包含多张不同样式的图像,使得最终做测试的时候,训练图像尽可能的不会被测试图像的一些小变化干扰。根据可能的照明条件和工具套件的变化,重复此过程。 捕获新图像,将其传递给 PatInspect 工具,并将新图像合并到经过统计训练的模式中。

  所以最终对于您添加的每个新图像,经过训练的模式变化越来越小,但最终您必须生成经过训练的模式,该模式可生成包含真正缺陷的阈值差异图像。

   下图显示了经过统计训练的模式,该模式说明了套件中对象位置的细微变化:

  当您获取足够的图像来训练模式时,单击结束统计训练。 结束统计训练允许 PatInspect 工具使用比启用统计训练更少的 PC 内存。

step9:运行run,进行比对   

  针对图像数据库中存在明确缺陷的图像测试 PatInspect 工具。我们可以将测试图片一一喂入PatInspectTool中,这样就可以查看差异图像,如果全为黑色,则表示差异很小属于正常图像,如果差异很大,则表示这张图像存在问题。

   下图显示了从缺少组件的工具包的采集图像生成的阈值差异图像:

  当然,最终的PatInspect 工具使阈值差异图像可供应用中的其他视觉工具进行进一步分析或图像处理。

 

3:界面介绍

3.1  训练界面

  界面如下:

  我们可以通过训练界面设置要训练的ROI区域,如下图所示:

3.2 训练区域设置界面

  界面如下:

  下图是设置训练区域,意思是输入图像要检测的区域,当然可以选择设置全图,也可以选择验证指定区域,比如我们下面我们调整的是训练的ROI区域。当然测试图像也通过定位,然后到PatInspectTool后,来使用检测区域。

 

3.3  运行参数界面

  界面如下:

3.4  结果页面

  界面如下:

VisionPro学习笔记(4)——PatInspect的更多相关文章

  1. VisionPro学习笔记(1)——软件介绍和基本使用

    前言 自己使用visionPro已经有段时间了,最近也一直在研究其算子的理论,为了加深印象,计划将自己的学习笔记整理在博客园,当然其官方文档对如何使用及其各种算子都有详细的介绍,所以这里的笔记仅仅为个 ...

  2. Visionpro学习笔记(壹)

    注册4年,第一次发了随笔.我的博客将主要涉及到visionPro软件的学习,labview数据采集方面的思考,c#及VS的学习 此随笔系列主要是关于VisionPro(以后简称VP)的学习及使用. 近 ...

  3. Visionpro学习笔记 :QuickBuild-Based Application Run-Once Button

    1) Creating a Run-Once Button 通过JobManager调用VisionPro文件.所有的过程放到一个Try/Catch块中. Private Sub RunOnceBut ...

  4. VisionPro学习笔记:用IEEE1394相机抓取图像

    1)找到采集卡: CogFrameGrabber1394DCAMs cameras = new CogFrameGrabber1394DCAMs(); 2)列举相连接的相机: ICogFrameGra ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  7. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  8. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  9. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  10. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

随机推荐

  1. 【LeetCode滑动窗口专题#2】无重复字符的最长子串

    #1传送门 无重复字符的最长子串 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: s = "abcabcbb" 输出: 3 解释: 因为 ...

  2. 罕见的技术:MSIL的机器码简析

    前言 一般的只有最终的汇编代码才有机器码表示,然一个偶然的机会发现,MSIL(Microsoft intermediate language)作为一个中间语言表示,居然也有机器码,其实这也难怪,计算机 ...

  3. jenkins中的坑_CreateProcess error=1392

    环境:windows11,jdk1.8,jenkins_2.346.war 起因 最近在使用jenkins部署项目的时候,填写仓库的url地址时,发现填完后报500这个错误,于是我打开jenkins的 ...

  4. 曲线艺术编程 coding curves 第十二章 玑镂(扭索)纹

    第十二章 玑镂(扭索)纹 原作:Keith Peters https://www.bit-101.com/blog/2022/11/coding-curves/ 译者:池中物王二狗(sheldon) ...

  5. TypeScript又出新关键字了?

    TypeScript 5.2将引入一个新的关键字:using.当它离开作用域时,你可以用Symbol.dispose函数来处置任何东西. { const getResource = () => ...

  6. 一份保姆级的Stable Diffusion部署教程,开启你的炼丹之路

    市面上有很多可以被用于AI绘画的应用,例如DALL-E.Midjourney.NovelAI等,他们的大部分都依托云端服务器运行,一部分还需要支付会员费用来购买更多出图的额度.在2022年8月,一款叫 ...

  7. Python潮流周刊#10:Twitter 的强敌 Threads 是用 Python 开发的!

    你好,我是猫哥.这里每周分享优质的 Python 及通用技术内容,大部分为英文,已在小标题注明.(标题取自其中一则分享,不代表全部内容都是该主题,特此声明.) 首发于我的博客:https://pyth ...

  8. 王道oj/problem23

    网址:oj.lgwenda.problem/23 代码: #define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include<stri ...

  9. NOI2023 题解

    打的太 shaber 了,于是补补题. D1T1 扫描线. 首先我们可以容斥一下,答案为被一种操作覆盖到的减去被两种操作覆盖到的加上被三种操作覆盖到的. 首先考虑只被一种操作覆盖到的,这很简单,直接上 ...

  10. Redis从入门到放弃(7):主从复制

    1.概念 主从复制是Redis的一项重要特性,用于将一个Redis服务器(Master主节点)的数据复制到其他Redis服务器(Slave从节点),以实现数据的高可用性和读写分离.数据的复制是单向的, ...