• 【缺陷检测】基于matlab GUI印刷电路板自动缺陷检测【含Matlab源码 1912期】


    一、印刷电路板自动缺陷检测简介

    我国是PCB生产大国,据世界电子电路理事会WECC各协会统计[1],2007年中国大陆PCB产值占全球总产值的27.9%,仅一年时间就比2006年增长了17.0%。但在我国PCB行业高速发展的同时,也面临着巨大的挑战,那就是PCB质量问题。在生产过程中任何一道工序甚至PCB上的任何1条线路出现问题都会导致整个PCB板的报废。高废品率提高了生产成本。如何及时发现并减少废品率,是当前所有PCB生产厂家的迫切需求。在当前人工目测、在线测试等众多检测方法中,自动光学检测AOI(Automatic Optic Inspection)在成本、效率、可靠性等方面都显示出独特的优势。本文通过图像处理技术开发了一套PCB缺陷自动检测系统。本文主要介绍该系统的软件实现部分。

    1 系统流程
    系统软件组成如图1所示。首先在同一个工作台上拍摄PCB标准图,这是为了尽量保持拍摄标准图与待测图具有相同的物距、焦距等,以减少图像配准的耗时以及尽量减少误差,提高识别率。对标准图进行中值滤波以滤除噪声平滑图像,然后保存标准图。检测时打开被测图,首先进行滤除噪声等预处理,然后通过定位圆进行图像配准;再做差影运算,通过阈值变换分离出差影特征。由于图像配准时不能完全做到像素一一对应以及阈值分割得不完美,将引起阈值变换后的二值图可能存在非缺陷部分。如果不能把这些部分去除,会造成误检。所以还需要进行形态学的变换来滤除噪点。最后则对分离出来的缺陷目标进行几何特征统计并得出结论。
    在这里插入图片描述
    图1 系统的软件处理流程

    2 图像的预处理与配准
    2.1 图像的去噪运算

    图像在形成、传输、接收和处理的过程中,不可避免地存在着外部和内部干扰,如光电转换过程中敏感元件灵敏度的不均匀性、数字化过程的量化噪声、传输过程中的误差以及人为因素等,都会引起噪声[2]。目前去噪效果很理想的算法是中值滤波。中值滤波是一种非线性的信号处理方法,其原理如下:假设有1个一维序列f1,f2,f3,…,fn,取该窗口长度(点数)为m(m为奇数)。对该序列进行中值滤波,即从序列中相继抽取m个数fi-v,…,fi-1,fi,fi+1,…,fi+v,其中fi为窗口的中心点值,v=(m-1)/2。再将这m个点值按其数值大小排序,取中间的那个数作为滤波输出,用公式表示为:yi=med{fi-v,…,fi-1,fi,fi+1,…,fi+v},其中i∈Z,v=(m-1)/2。图2所示为中值滤波前后图片的对比效果。由此可见,中值滤波对滤除噪声,保留特征信息具有比较理想的效果。
    在这里插入图片描述
    图2 中值滤波效果图

    2.2 图像的配准
    图像的配准是对取自不同时间、不同传感器或者不同视角的同一场景的2幅图像或者多幅图像图形匹配的过程。图像配准通常通过计算图像的相似度来进行,而图像的相似度是通过计算相似性测度评价的。相似性测度又分为互相关相似性测度、基于傅里叶分析的测度以及序贯相似性检测。其中互相关相似测度是最基本的相似性测度,其原理如下:假设有模板T和搜索图S,Si,j表示模板覆盖下的那块搜索图[3],其中i、j表示位置。则其互相关相似度为:
    在这里插入图片描述
    归一化为:
    在这里插入图片描述
    T和Si,j越相似,则R(i,j)越大,当T和Si,j完全相似时,R(i,j)=1,因此可以根据R(i,j)的大小来判断T和Si,j的相似程度。

    2.3 几何匹配
    2.3.1 匹配原理

    本文对缺陷检测采取差影法检测,差影法检测必须是待测图与标准图的像素基本对应。所以差影法的核心就在于图像的几何匹配。待测图与标准图的匹配通常采用设置定位标志来解决,也就是在PCB板对角线部位通过添加特定的图形,定位时通过图形在标准图和目标图板上的几何位置差异进行缩放、平移和旋转的几何操作来实现待测图与标准图的像素一一对应。几何匹配的效果很大程度上取决于定位图形位置尺寸的获取。通常定位图形选用形状规则的圆来进行,不仅因为圆心坐标具有很好的定位作用,还因为目前对于圆检测的研究已经相对比较成熟,比较容易检测出圆的特征尺寸。

    2.3.2 圆的检测
    对于圆的检测目前绝大多数是通过Hough变换来进行。Hough变换是利用图像空间与参数空间的对应关系,将图像控件的检测问题转化到参数空间,通过参数空间进行简单的累加统计来完成检测任务。Hough变换的圆形检测原理其圆的方程表示为:
    在这里插入图片描述
    在参数空间建立1个三维的累加数组A(a,b,r),计算出每1个三元组(a,b,r),并对A累加:
    在这里插入图片描述
    如果半径r固定,则参数空间与图像空间的对应如图3所示。黑色部分对应图像空间中的圆周上的点,而圆周则为可能的圆心位置。因此,在图像空间中共圆的点在参数空间中对应同一个点,即图像空间中的点对应参数空间中的圆,参数空间中的点对应图像空间中的圆。算法的实现也正是利用了这种特性。
    在这里插入图片描述
    图3 Hough变换的参数空间
    如果直接通过这种方法进行圆检测,由于需要对整幅图的像素进行逐点运算并判断,会占用很多系统时间,因此速度上无法满足实时性的需求。基于Hough变换的圆检测方法[5]通过先对图像进行灰度化、去噪、边缘检测以及形态学运算等预处理,再通过使用多维数组代替循环计算进行Hough变换,可以大大提高检测速度与准确率。

    2.3.2 图像的几何变换
    图5所示为PCB板定位圆的位置,其中A(x1,y1)、B(x2,y2)分别为2个定位圆的圆心坐标。由于标准板上和待测板上都有定位圆,因此待测图因摄像头畸变或者工作台振动而产生的偏差可以通过A、B坐标的偏差对待测图进行几何变换进行调整,调整步骤为:

    (1)计算出待测图定位圆心的水平偏角θAB和标准图的θ′AB。如果θAB≠θ′AB,则对待测图进行旋转变换。旋转角度为θAB―θ′AB(顺时针方向为正)。

    (2)计算出待测图定位圆心的距离LAB和标准图的L′AB,如果LAB≠L′AB,则对待测图进行缩放变换。缩放倍数为n=L′AB/LAB(n>1表示缩放)。

    (3)计算出待测图2个定位圆心线段的中点坐标经过(1)、(2)两步运算后的坐标D。将D与标准图的D′进行比较,如果不相等,则X方向平移Dx′-Dx,Y方向平移Dy′-Dy(屏幕左上角为原点,X轴正方向朝右,Y轴正方向朝下)。
    在这里插入图片描述
    图5 定位圆

    3 缺陷检测
    3.1 阈值变换

    几何配准对标准图和待测图做差运算,得到的差影图如图6(a)所示,此图并非二值图,为了对缺陷进行统计识别,需要通过阈值分割将其转化为二值图。图像分割的方法可分为固定阈值分割和自动阈值分割。固定阈值分割是通过一个确定的或者人为操作时选定的阈值进行二值化的方法。由于该法很不灵活且不具有自动性,所以本文主要讨论自动阈值分割,通过搜索直方图的方法来选取全局阈值进行分割。该类方法主要有:双峰法、最大内间方差阈值(OSTU)法、P_tittle阈值分割法、最大熵法等。本文使用最大内间方差阈值(OSTU)法[5]。该法基本思想是:最佳阈值应当使得不同类之间的可分离性最大。把待处理图像的直方图在某一阈值与支出分割为2组,当被分割成2组的间方差最大时,决定阈值。OSTU分割后的图像如图6(b)所示。
    在这里插入图片描述
    图6 差影运算与阈值分割效果

    3.2 形态学变换
    由于配准过程存在的误差以及图片本身的微小畸变缺陷,所以差影运算后的图像会有无法消去的非缺陷部分。如图7所示,其灰度值和缺陷部分灰度值相差不大,阈值分割后也必然存在这部分噪点,如果不把这些部分消除掉,会造成误检。通过形态学变换可以消除这些噪点。
    在这里插入图片描述
    图7 形态学运算后
    形态学又称数学形态学[6],是一种分析几何形状的数学方法,是建立在集合代数基础上的,用集合论方法定量描述集合结构的科学。最基本的形态学运算子有:腐蚀(Erosion)、膨胀(Delation)、开(Opening)和闭(Closing)。由于需要滤除噪点,本文使用了腐蚀和开运算。

    对于1个给定的目标图像X和1个结构元素S,如果S在图像上移动,在每1个当前位置x,S[x]只要3种可能的状态:S[x]⊆X、S[x]⊆Xc、S[x]∩X与S[x]∩Xc均不为空。其中满足S[x]⊆X的点x的全体构成结构元素与图像的最大相关点集,则称这个点集为S对X的腐蚀,记为XӨS。用集合的方式定义为:XӨS={x|S[x]⊆X}。腐蚀的作用是消除物体边界点,可以把小于结构元素的物体去掉,选取不同大小的结构元素,就可以去掉不同大小的物体。

    腐蚀可以看作是将图像X中每1个结构元素S全等的S[x]收缩为点x。反之,将X中的每1个点X扩大为S[x]。这就是膨胀运算,用集合方式定义为:XӨS={x S[x]∩x≠0}。与腐蚀相反,膨胀运算的作用是把图像周围的背景点合并到物体中。

    开运算和闭运算是在腐蚀和膨胀的基础上定义的。开运算就是对图像先进行腐蚀运算再进行膨胀运算。而闭运算是对图像先进行膨胀运算再进行腐蚀运算。

    通过这4种形态学算子的组合可以对图像进行包括图像分割、特征抽取、边缘检测、图像滤波、图像增强和恢复等操作。图7是对阈值分割后的图进行1次腐蚀运算和1次开运算后的结果。留下来的4处正是目标电路板上缺陷位置的二值图。

    二、部分源代码

    function varargout = Mainyinshua(varargin)
    % Prepared by OON CHEE YEE, 27737268
    % MAINYINSHUA MATLAB code for Mainyinshua.fig
    %      MAINYINSHUA, by itself, creates a new MAINYINSHUA or raises the existing
    %      singleton*.
    %
    %      H = MAINYINSHUA returns the handle to a new MAINYINSHUA or the handle to
    %      the existing singleton*.
    %
    %      MAINYINSHUA('CALLBACK',hObject,eventData,handles,...) calls the local
    %      function named CALLBACK in MAINYINSHUA.M with the given input arguments.
    %
    %      MAINYINSHUA('Property','Value',...) creates a new MAINYINSHUA or raises the
    %      existing singleton*.  Starting from the left, property value pairs are
    %      applied to the GUI before Mainyinshua_OpeningFcn gets called.  An
    %      unrecognized property name or invalid value makes property application
    %      stop.  All inputs are passed to Mainyinshua_OpeningFcn via varargin.
    %
    %      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
    %      instance to run (singleton)".
    %
    % See also: GUIDE, GUIDATA, GUIHANDLES
    
    % Edit the above text to modify the response to help Mainyinshua
    
    % Last Modified by GUIDE v2.5 23-Jun-2022 19:33:32
    
    % Begin initialization code - DO NOT EDIT
    gui_Singleton = 1;
    gui_State = struct('gui_Name',       mfilename, ...
                       'gui_Singleton',  gui_Singleton, ...
                       'gui_OpeningFcn', @Mainyinshua_OpeningFcn, ...
                       'gui_OutputFcn',  @Mainyinshua_OutputFcn, ...
                       'gui_LayoutFcn',  [] , ...
                       'gui_Callback',   []);
    if nargin && ischar(varargin{1})
        gui_State.gui_Callback = str2func(varargin{1});
    end
    
    if nargout
        [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
    else
        gui_mainfcn(gui_State, varargin{:});
    end
    % End initialization code - DO NOT EDIT
    
    
    % --- Executes just before Mainyinshua is made visible.
    function Mainyinshua_OpeningFcn(hObject, eventdata, handles, varargin)
    % This function has no output args, see OutputFcn.
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    % varargin   command line arguments to Mainyinshua (see VARARGIN)
    
    % Choose default command line output for Mainyinshua
    handles.output = hObject;
    
    % Update handles structure
    guidata(hObject, handles);
    
    % UIWAIT makes Mainyinshua wait for user response (see UIRESUME)
    % uiwait(handles.figure1);
    
    
    % --- Outputs from this function are returned to the command line.
    function varargout = Mainyinshua_OutputFcn(hObject, eventdata, handles) 
    % varargout  cell array for returning output args (see VARARGOUT);
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Get default command line output from handles structure
    varargout{1} = handles.output;
    
    
    % --- Executes on button press in CheckDefects.
    function CheckDefects_Callback(hObject, eventdata, handles)
    % hObject    handle to CheckDefects (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Creating global variables to be used across Callback Function
    global template test defect
    % Display image in top right axes
    axes(handles.axes6)
    % by using image substraction between template and test, defects can be
    % identified as diff_1 variable
    defect= imabsdiff(template,test);
    % display test image 
    imshow (test)
    % draw a boundingbox on each defect found on PCB
    all_defect_bboxes = regionprops(defect,'BoundingBox','centroid');
    hold on
    
    for i = 1:length(all_defect_bboxes)
        % Accessing each bounding box to obtain its position and insert
        % annotation
        each_boundingbox = all_defect_bboxes(i).BoundingBox;
        rectangle('Position',each_boundingbox,'EdgeColor','r','LineWidth',1.5)    
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101

    三、运行结果

    在这里插入图片描述
    在这里插入图片描述

    四、matlab版本及参考文献

    1 matlab版本
    2014a

    2 参考文献
    [1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
    [2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
    [3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
    [4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
    [5]胡秀亮,高志,叶健敏,王涛.基于图像处理技术的PCB缺陷自动检测系统[J].微型机与应用. 2010,29(01)

    3 备注
    简介此部分摘自互联网,仅供参考,若侵权,联系删除

  • 相关阅读:
    ElasticSearch容器化从0到1实践(问题汇总)
    【LeetCode-中等题】15. 三数之和
    Linux:文件解压、复制和移动的若干坑
    综合布线系统可由以下子系统组成
    开发干了五年,拿下这份Java面试资料,这个秋招终于可以不愁掉头发了
    java计算机毕业设计网上体育用品销售系统源程序+mysql+系统+lw文档+远程调试
    SparkStreaming在实时处理的两个场景示例
    LRU自定义最近最少使用-java实现
    若依框架,小程序访问后端,后端访问客户端,客户端读取图片返回
    32:第三章:开发通行证服务:15:浏览器存储介质,简介;(cookie,Session Storage,Local Storage)
  • 原文地址:https://blog.csdn.net/TIQCmatlab/article/details/125463263