【缺陷检测】基于形态学实现印刷电路板缺陷检测技术附matlab代码

1 简介

当今,电子工业在国家经济发展中扮演着越来越重要的角色,作为各种电子元器件的高度信息集合,印刷电路板(PCB)被广泛应用在电子工业中的各个领域。经济的不断发展促使电子技术不断地提高,轻薄、便捷的电子工艺成为潮流,高密集、高集成度成为PCB的发展趋势,这给传统的PCB质检带来了十分巨大的挑战。传统的人工检测方法存在着速度慢、时间长和易漏检等等问题,完全无法适应技术和工艺的快速发展,怎样实现精准、高效的PCB自动缺陷检测,一直是电子工业领域非常重视的一个问题。同时,个人和中小企业对检测PCB缺陷的需求越来越高,能否达到低成本、高精度是首要考虑的问题。因此,研究如何通过低成本的图像处理技术提高PCB板缺陷检测的精度具有重要的研究意义。  基于图像的PCB缺陷检测流程包括图像预处理、图像配准、图像分割和图像识别等方面,其中图像预处理又包含图像增强、图像平滑和图像锐化操作。​

2 完整代码

function pcbjiance()dcpcbrgb=imread('待检测pcb.jpg');%读入待检测pcb图像figure(1)imshow(dcpcbrgb);title('待检测pcb');t=rgb2gray(dcpcbrgb);%待检测pcb图像灰度化lvbo=medfilt2(t);%中值滤波uu=im2bw(lvbo);%二值化u=bwmorph(uu,'spur',8);%去除物体小的分支p=bwmorph(u,'fill');%填充孤立黑点dc=bwmorph(p,'clean');%去除孤立亮点figure()imshow(dc);title('预处理后待检测pcb图像');goldenpcbrgb=imread('标准pcb图像.jpg');%读入标准pcb图像biaozhungray=rgb2gray(goldenpcbrgb);%标准pcb图像灰度化bj=im2bw(biaozhungray);%二值化figure()imshow(goldenpcbrgb);title('标准pcb');figure()imshow(bj);title('标准pcb二值化图像')dc_rect=[80 370 150 130];%待检测pcb图像中选取参与互相关计算区域的矩阵bj_rect=[40 320 200 190];% 标准pcb图像中选取参与互相关计算区域的矩阵bj_sub=imcrop(bj,bj_rect);%剪裁标准pcb图像  max_c=0;%初始化互相关最大值 for rr=-2:1:2%待检测pcb图像依次旋转的角度(步进值可调)    dc_rot=imrotate(dc,rr,'nearest');%待检测pcb图像旋转,使用邻近插值法    dc_sub=imcrop(dc_rot,dc_rect);%裁剪带检测pcb图像    c=normxcorr2(dc_sub,bj_sub);%计算互相系数[max_c1,imax1]=max(abs(c(:)));%max_c1为系数最大值,imax1为系数最大值对应的位置下标   if(max_c1>max_c)%每一次循环的最大值进行比较      max_c=max_c1;%取最大的值      angle=rr;%把取得最大值时对应的旋转角度赋给angle   endenddc_tz=imrotate(dc,angle,'nearest');%按angle角,对待检测pcb图像进行旋转修正dc_tz_sub=imcrop(dc_tz,dc_rect);%此时两幅图像的轴向已平行,重新计算互相关系数cc=normxcorr2(dc_tz_sub,bj_sub);% [max_cc,imax]=max(abs(cc(:)));% [ypeak,xpeak]=ind2sub(size(cc),imax);%将下标转化为行列的表示形式  yd=[ypeak-(dc_rect(4)+1) xpeak-(dc_rect(3)+1)];%子图需移动的量 bj_dc=[yd(1)+bj_rect(2) yd(2)+bj_rect(1)];%标准pcb图像在调整后的待检测图像中的坐标 xz=[bj_dc(1)-dc_rect(2) bj_dc(2)-dc_rect(1)];%像素修正值 dc_qu_rect=[1-xz(2) 1-xz(1) size(bj,2)-1 size(bj,1)-1]; %调整后的待检测图像中选取与标准图像同等大小的区域矩阵 dc_qu=imcrop(dc_tz,dc_qu_rect);%裁剪调整后的待检测pcb图像 figure()imshow(dc_qu)title('匹配后的待检测pcb图像')yihuo=xor(bj,dc_qu);%图像异或运算MN=[3 3]; se=strel('rectangle',MN);%定义结构元素imr=imerode(yihuo,se);%腐蚀运算imd=imdilate(imr,se);%膨胀运算rgb=label2rgb(imd,@autumn,'g');%标注对象变为彩色,采用autumn映射表,背景为绿色biaoji=imlincomb(.6,rgb,.4,goldenpcbrgb);%将两幅图像按比例线性组合figure()imshow(biaoji);title('缺陷标注'); a1=bj;b1=dc_qu;c1=a1-b1;c2=b1-a1;MN=[5 3];se=strel('rectangle',MN);h1=imerode(c1,se);h2=imerode(c2,se);[i,j]=find(h1==1);p1=bwselect(c1,j,i,8);[q1,mu1]=bwlabel(p1);num1=0;num1=mu1;hpqs=0;%焊盘缺失数初始化 dxqs=0;%导线缺失数初始化aoxian=0;%凹陷数初始化duan4lu=0;%断路数初始化for k1=1:num1r1=zeros(size(q1));ij1=find(q1==k1);r1(ij1)=1;[i1,j1]=find(q1==k1);f1=bwselect(a1,j1,i1,8);if bweuler(r1)==0;    hpqs=hpqs+1;else     if bwarea(r1)>500        dxqs=dxqs+1;    else       s1=f1-r1;      if bweuler(s1)==bweuler(f1)          aoxian=aoxian+1;       else bweuler(s1)>bweuler(f1)         duan4lu=duan4lu+1;        end    endendend[i0,j0]=find(h2==1);p2=bwselect(c2,j0,i0,8); [q2,mu2]=bwlabel(p2);num2=0;num2=mu2;hpds=0; %焊盘阻塞数初始化dxdy=0;%导线多余数初始化tuqi=0;%突起数初始化duan3lu=0;%短路数初始化tongban=0;%铜斑数初始化for k2=1:num2r2=zeros(size(q2));ij2=find(q2==k2);r2(ij2)=1;[i2,j2]=find(q2==k2);f2=bwselect(b1,j2,i2,8);if bwarea(f2)-bwarea(r2)<=10    tongban=tongban+1;else     if bwarea(r2)>300        dxdy=dxdy+1;    else       s2=f2-r2;      if bweuler(s2)==bweuler(f2)          tuqi=tuqi+1;         elseif bweuler(s2)>bweuler(f2)         duan3lu=duan3lu+1;            else bweuler(s2)        hpds=hpds+1;           end    endendendhpqsdxqsaoxianduan4luhpdsdxdytuqiduan3lutongban

3 仿真结果

【缺陷检测】基于形态学实现印刷电路板缺陷检测技术附matlab代码_第1张图片

【缺陷检测】基于形态学实现印刷电路板缺陷检测技术附matlab代码_第2张图片

4 参考文献

[1]熊昊. 基于图像的PCB板缺陷检测技术及应用[D]. 重庆理工大学.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。

你可能感兴趣的:(图像处理,matlab)