缺陷检测方法 halcon

2023-11-09



前言

        缺陷检测算法不同于尺寸、二维码、OCR等算法。后者应用场景比较单一,基本都是套用一些成熟的算子,所以门槛较低,比较容易做成标准化的工具。而缺陷检测极具行业特点,不同行业的缺陷算法迥然不同,常见的是对物品表面缺陷的检测,比如工件表面的斑点、凹坑、划痕、色差、缺损等缺陷进行检测。随着缺陷检测要求的提高,机器学习和深度学习也成了缺陷领域一个不可或缺的技术难点,接下来我会对标准缺陷检测算法、以及半导体行业的非标算法做一个简单分析:


1. 缺陷检测分类

1.1 标准缺陷检测

所谓标准,就是不针对行业特点,这里基本分为如下几类:

  • 标准预处理功能: 图像增强、腐蚀、膨胀、开运算、闭运算、滤波、傅立叶变换(频域空间域转换)、距离变换、差分、等
  • 面积检测:阈值后计算ROI内面积
  • Blob(阈值分割+特征提取)检测:阈值联通后计算Blob
  • 浓度差检测:计算ROI范围内的最大浓度、最小浓度、浓度差
  • 直线/曲线上的毛刺/缺陷:拟合直线/曲线,计算边缘点到直线/曲线距离

标准的做法一般都是拿标准的算法块进行组合,以达到缺陷检测的效果,缺陷检测标准流程一般是:

1设置基准图模板——>2当前图模板定位——>3生成仿射变换矩阵——>4旋转平移图像或者区域——>5预处理差分——>6预处理滤波/腐蚀/膨胀——>7Blob检测——>8面积检测


1.2 非标缺陷检测(针对行业特性)

        相对与标准做法,非标的做法就非常多,有些非标的目的是为了减少操作步骤,例如将上面的组合流程变成一个工具,这个我们称之为业务逻辑非标。还有一些非标主要是做图像预处理部分,例如修改一些标准预处理的算子和预处理流程,将瑕疵提取出来。当然,对数学理论掌握程度较高的朋友,会推导理论公式,然后直接实现数学公式达到检测效果。


2. 行业难点

  • 传统算法检测缺陷:调试难度大,容易在检测不稳定情况下反复调参,且复杂缺陷误测多,兼容性差
  • 机器学习检测缺陷:一般使用类似MLP的一些单层神经网络,对缺陷特征进行训练分类,该方法需要事先提取出缺陷部分,一般用来与传统分割法搭配使用,达到缺陷检测分类的效果。
  • 深度学习检测缺陷(打标签):一般需要客户提供大量的缺陷样本,而且缺陷种类越多、特征越不明显,需要的缺陷样本就越大。其次,打标签过程很难做到自动,需要手动辅助框出缺陷位置,工作量非常大。总结就是训练周期久,训练样本大,如果客户可以提供大量样本,那该方法是首选(半导体行业一般不会出现大量缺陷样品)
  • 深度学习检测缺陷(迁移学习法):该方法我感觉会成为后面工业领域检测瑕疵的一个大趋势,但是需要一些公司去收集各种行业的缺陷类型图片和训练的网络模型,并共享出来(突然感觉是个商机,就看谁能抓住了),然后我们可以使用迁移学习的方法学习别人训练好的模型。

3. 常规缺陷检测算法(Halcon

总的来说,缺陷检测的算法包括:

  • Blob分析+特征提取(常用,较简单)
  • 定位(Blob定位、模板匹配定位)+ 差分(常用)
  • 光度立体
  • 特征训练
  • 测量拟合(常用)
  • 频域+空间域结合(常用)
  • 深度学习

3.1 差分法

        标准缺陷检测我觉得用差分法还是蛮多的。顾名思义,差分就是通过对两幅图像或和两个区域作差,来找出其中有差异的区域。处理流程基本就是定位Blob分析+差分模板匹配+差分的方式,主要用来检测物品损坏,凸起,破洞,缺失,以及质量检测等。两种方式的具体流程如下:

3.1.1 blob分析+差分

检测流程如下:

  1. 读取图像
  2. 对图像进行Blob分析,提取图像上的Roi检测区域
  3. 在对Roi区域直接进行差分处理或者与没有缺陷的图像进行差分处理
    ps:这里差分包含区域差分图像差分两种方式。
  4. 最后求差集,根据差集部分的面积判断该物品是否有缺陷

流程解析:以标准图像中的灰度值为模板,计算处检测图像的灰度值,并与标准图像作差,灰度值差异越大,则证明检测图像中存在与标准图比有明显灰度变化的区域,即这部分区域就是我们所要筛选出的缺陷区域。

示例分析:提取灰度值明显的缺陷区域

*1.使用`intensity()`算子计算出模板图(即标准图,图1)的检测区域图像的灰度平均值`OriginalMean`
intensity(OriginalRegion, ImageReduced1, OriginalMean, Deviation1) 

*2.</span><span class="token variable">intensity</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">算子计算出待测图(图2)的检测区域图像的灰度平均值</span><span class="token variable">DetectMean</span><span class="token punctuation">,计算出两幅图像灰度均值的差值
intensity (DetectRegion, ImageReduced2, DetectMean, Deviation2)
tuple_abs (OriginalMean-DetectMean, Abs)

3.
如果两个区域的灰度值差值大于10(if(Abs>10)),则生成一副图像(图3),其灰度值为模板图中计算得到的的平均灰度值;
如果两个区域的灰度值差值小于10(if(Abs<10)),则生成一副图像(图3),其灰度值为待测图中计算得到的的平均灰度值。
ps:这里计算结果是差值小于10,也就是检测图的灰度值差异和模板图差异不大,直接生成一个后者的灰度均值图像
if(Abs>10)
gen_image_proto (ImageReduced2, ImageCleared, OriginalMean)
else
gen_image_proto (ImageReduced2, ImageCleared, DetectMean)
endif
reduce_domain (ImageCleared, RegionDifference, ImageReduced1)

*4.将待测图与新生成的灰度值图像做差值(图4),可以找到待测图和模板图灰度值有差异的区域
abs_diff_image (ImageReduced2, ImageReduced1, ImageAbsDiff, 1)
invert_image (ImageAbsDiff, ImageInvert)
threshold (ImageInvert, Region1, 0, 30)
opening_circle (Region1, RegionOpening, 1.5)
connection (RegionOpening, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 10, 99999)

    NumImages := 16
    for Index := 1 to NumImages by 1
    read_image (Image, ‘plastics/plastics_’ + Index$‘02’)
    rgb1_to_gray (Image, Image)
    3.计算一个图像的实值快速傅里叶变换(空间域转至频域)
    rft_generic (Image, ImageFFT, ‘to_freq’, ‘none’, ‘complex’, Width)
    4.用在频域内的滤波器使一个图像卷积。
    convol_fft (ImageFFT, Filter, ImageConvol)
    5.卷积后的频域图像转至空间域
    rft_generic (ImageConvol, ImageFiltered, ‘from_freq’, ‘n’, ‘real’, Width)
    6.滤波之后的图像交给形态学来分析
    空间域上的blob图像分割
    原图矩形内的灰度值范围(max-min)作为输出图像像素值,扩大了亮的部分
    gray_range_rect (ImageFiltered, ImageResult, 10, 10)
    获得图像最大灰度值和最小灰度值
    min_max_gray (ImageResult, ImageResult, 0, Min, Max, Range)
    二值化提取( 5.55是经验值,在调试中得到)
    threshold (ImageResult, RegionDynThresh, max([5.55,Max * 0.8]), 255)
    select_shape (RegionDynThresh, SelectedRegions, ‘area’, ‘and’, 1, 99999)

      * 1.创建一个高斯滤波器,用于将傅里叶转换后的图像进行滤波
      gen_gauss_filter (GaussFilter, 3.0, 3.0, 0.0, ‘none’, ‘rft’, Width, Height)

      对灰度图像进行颜色反转
      invert_image (ImageGray, ImageInvert)
      2.对反转后的图像进行傅里叶变换
      rft_generic (ImageInvert, ImageFFT, ‘to_freq’, ‘none’, ‘complex’, Width)
      3.对傅里叶图像做卷积,使用之前创建的高斯滤波器作为卷积核
      convol_fft (ImageFFT, GaussFilter, ImageConvol)
      4.将卷积后的傅里叶图像还原为空间域图像。可见图像的突变部分得到了增强
      rft_generic (ImageConvol, ImageFiltered, ‘from_freq’, ‘n’, ‘real’, Width)

      * 5.设置提取线条的参数,将图像中的有灰度差异的线条提取出来
      calculate_lines_gauss_parameters (17, [25,3], Sigma, Low, High)
      lines_gauss (ImageFiltered, Lines, Sigma, Low, High, ‘dark’, ‘true’, ‘gaussian’, ‘true’)

      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19

      在这里插入图片描述

      本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

      缺陷检测方法 halcon 的相关文章

      随机推荐

      • C++类 ——初始化列表

        目录 前言 一 什么是初始化列表 二 为什么要有初始化列表 三 怎么使用初始化列表 前言 我们今天要解决三个问题 什么是初始化列表 为什么要有初始化列表 怎么用初始化列表 一 什么是初始化列表 初始化列表是一种初始化类的成员变量的方式 用于
      • STM32——CAN通信

        1 CAN通信概述 STM32F103有两个CAN 都分别有自己的发送接收邮箱 发送邮箱共有3个来发送报文 发送调度器根据优先级决定哪个邮箱的报文先被发送 共有2个接收FIFO 每个FIFO都可以存放3个完整的报文 它们完全由硬件来管理 C
      • 物体识别实例,抠图

        本示例演示了玉米图像识别的部分 处理步骤如下 首先 读取图像 灰度 然后 二值化固定物体 最后 画出物体 读取图像 灰度 read image Image XXXXX bmp decompose3 Image Image1 Image2 I
      • 关于antd table组件中,数据渲染条数跟后台传入数据不一致的问题

        如果出现表格数据渲染 跟后台传过来的数据的条数不一致的情况 绝大概率的rowkey的问题 我这边当时调试的时候 后台的数据我是存在store中的 包括在table重新渲染的时候 我这边传过来的数据条数都是跟后台的保持一致的 但是渲染的时候
      • solver_factory.hpp:76] Check failed: registry.count(type) == 1 (0 vs. 1) Unknown solver type: SGD

        问题描述 本人遇到这个问题的环境 Ubuntu16 CUDA8 Caffe Matlab2015b 具体环境安装可见个人博客 在编译matlab版本caffe时遇到 安装正常 编译caffe正常 编译matcaffe正常 测试matcaff
      • 拒绝数据裸奔,进行3DES加密很重要!(Java,JavaScript)

        一 前言 对于3DES加密百度上大部分都有很详细的解释这里就不再赘述 本文只针对Java以及JavaScript进行使用3DES加密的过程进行详细的解答 并对容易采坑以及容易疑惑的地方进行详细解释 注意点 1 3DES加密key 必须为24
      • yoloe 超过yolox和yolov5

        号称超过yolox和yolov5的PP YoLoE 开源地址 GitHub PaddlePaddle PaddleDetection Object Detection toolkit based on PaddlePaddle It sup
      • jquery validation engine ajax,jquery ajax validation engine not working

        my jquery validation form is not validate here is the code like document ready function frm validationEngine validate HD
      • 在vscode中的js文件中自动补全html标签

        code 首选项 settings 查找settings json 然后在json文件中加入 emmet includeLanguages javascript html
      • 汉德笔试,感觉有些难的手机密码的动态规划题

        汉德公司的笔试编程题有两个 一个很简单 另一个感觉是加分题 当场没做出来后来做出来了 1 充电桩 N个电桩 第一个输入为ele数组 就是能充多少电 第二个输入为耗电数组 到下一站费多少电 要求输出为从任意一个充电桩进入 能跑一圈 则输出这个
      • C double转char字符串

        找个double转char字符串的代码 国内搜出来的都是些什么狗屎 翻墙出去 一搜就有几种不错的方法 方法1 使用sprintf https cboard cprogramming com c programming 38507 doubl
      • android里用Paint画圆环的时候,让圆环的笔头头部变圆

        DrawArc画圆环的时候 如果设置width过大 那么直角的笔头会画得很丑 这个时候使用以下这句就行了 Piant setStrokeCap Cap ROUND
      • xinput1_3.dll缺失了如何去修复?xinput1_3.dll解决方法分享

        缺失了xinput1 3 dll文件 对应用程序或游戏的正常运行造成了严重的影响 这个动态链接库文件 DLL 是由Microsoft Corporation开发的 它是一个重要的Windows系统文件 提供了针对Xbox 360控制器的输入
      • eclipse error: * could not be resolved

        转自 http lihaichuan blog 51cto com 498079 1060466 打开Eclipse后 编辑c c 编译时出错 could not be resolved 但运行结果正确 解决办法 在eclipse上 pro
      • Nginx实战(四) 限速功能

        本文转载至 http blog csdn net u012486840 article details 52787275 如果很多用户 同一时刻下载nginx服务器上面的资源 这样会对nginx服务器的I O产生极大负担 所以对nginx服
      • 备份文件下载

        一 备份文件下载 1 网站源码 开启题目 点开链接后 进入环境 可以看到常见网站源码备份文件的后缀和备份文件名 打开burp暴力破解flag 设置打开代理 开始抓包 2 bak文件 开启bak题目 点开链接 进入环境 出现这个界面 打开文件
      • flask url 构建

        from flask import Flask redirect url for import time app Flask name app route def hello world return hello world app rou
      • Qt QTableWidget设置表头背景色不成功的原因

        QTableWidget没有设置背景色的函数 通过Qss样式来设置背景色 m pTable gt horizontalHeader gt setStyleSheet QHeaderView section background color
      • Java8的新特性以及使用

        1 通过10个示例来初步认识Java8中的lambda表达式 我个人对Java 8发布非常激动 尤其是lambda表达式和流API 越来越多的了解它们 我能写出更干净的代码 虽然一开始并不是这样 第一次看到用lambda表达式写出来的Jav
      • 缺陷检测方法 halcon

        文章预览 前言 1 缺陷检测分类 1 1 标准缺陷检测 1 2 非标缺陷检测 针对行业特性 2 行业难点 3 常规缺陷检测算法 Halcon 3 1 差分法 3 1 1 blob分析 差分 3 1 2 模板匹配 差分 3 1 3 两种检测方