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,'spur8);%去除物体小的分支
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_c系数最大值为1,imax1标记在系数最大值对应的位置
if(max_c1>max_c)比较每个循环的最大值%
max_c=max_c1;%取最大值
angle=rr;%赋予获得最大值时相应的旋转角度angle
end
end
dc_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:num1
r1=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
end
end
end
[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:num2
r2=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)<bweuler(f2)
hpds=hpds+1;
end
end
end
end
hpqs
dxqs
aoxian
duan4lu
hpds
dxdy
tuqi
duan3lu
tongban
3 仿真结果
4 参考文献
[1]熊昊. 基于图像的PCB板缺陷检测技术及应用[D]. 重庆理工大学.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。