使用形态学处理相关算法对芯片电路图焊接锡点缺陷进行检测

up目录

一、理论基础

二、核心程序

三、测试结果


一、理论基础
当前我国信息科技的发展, 产业界自动化生产水平越来越高。 具体在电子产品行业, 随着精细化和自动化的发展, 电子产品的焊点质量的好坏, 深刻地影响着产品成品的质量和效率, 因此, 对于焊点的缺陷检测也成为了 电子制造行业亟需解决的问题。 传统的人工检测方法存在费时、 精度低、 效率低下等问题, 各种新的检测方法应运而生。 其中, 机器视觉运用到自动化生产乃至焊点检测已经成为当代自动化生产发展的趋势。 世界制造业的发展, 对于电子产品的焊点自动化检测的智能化技术水平也提出了 更高的要求, 实现焊接产品制造的自动、 柔性化和智能化已经成为焊接技术发展的新趋势。具体在机器视觉应用于焊点检测过程中: 首先通过对焊点的图像进行采集,对焊点区域进行定位, 提取出焊点图像; 再对焊点图像进行特征分析处理, 得到参数反馈, 以降低人工失误、 提高产品生产效率、 保证产品质量和可靠性。运用图像处理算法对焊点质量进行检测, 可以在很多的电子元器件加工中进行使用, 如PCB焊点、 手机GBA焊点等。本文以手机锂电池中的焊点作为检测对象, 采用机器视觉和图像处理方法,实现了 对漏焊、 焊点粘连、 虚焊、 过焊的缺陷检测。 本文完成的主要工作包括:

(1)介绍了 常用的图像预处理和特征提取方法, 针对焊点图像的特点, 对图像进行灰度对比度增强, 同时采用中值滤波去除图像中的噪声; 提出一种合理的快速迭代分割二值图像的方法;

(2)在充分考虑灰度与空间的关系以及算法复杂度的基础上, 提出了 一种基于距离变换的分水岭分割算法, 准确的分割出了 目 标区域和检测出粘连区域;

(3)对焊点图像特征的缺陷进行检测和识别。 本文主要识别的是四种类型的缺陷: 漏焊、 焊点粘连、 虚焊、 过焊;

(4)开发了 系统的控制软件, 实现了 焊点缺陷有效检测, 并给出了 实验结果。

 

 

由体积比较小的元器件引起的焊接问题中,焊锡桥接是最常见的问题。当电路板上两个不应该连接的两个焊点在PCB 焊接过程中不经意地被焊锡连接时,就会形成桥联。根据电路结构的不同,可能会造成各种损坏。

具体的处理步骤如下:

图像预处理
step1:灰度图
step2:去噪,采用中值滤波算法
step3:二值化
step4:平滑处理

芯片缺陷检测
step1:将面积巨大的区域视为光线影响,将其背景化

step2:由于图形处理时,会出现部分细小的间隔的图,这种情况视为图形处理导致的误差,所以进行合并

step3:将面积较小的区域视为缺陷部分,直接去除处理

step4:提取芯片的管脚

step5:利用视觉效果处理,计算每个定位点下面的区域的面积和周长

二、核心程序

%step1:将面积巨大的区域视为光线影响,将其背景化
[L,n] = bwlabel(I_gray_filter2);%计算连通区域的个数
index = 0;
L2 = zeros(rows,cols);
L3 = zeros(rows,cols);
for i=1:n
[r,c] = find(L==i); %计算每个连通区域的坐标值
a1(i) = max(r); a2(i) = min(r); %X坐标
b1(i) = max(c); b2(i) = min(c); %y坐标
w(i) = b1(i)-b2(i); %连通区域的行范围
h(i) = a1(i)-a2(i); %连通区域的列范围
%计算占用面积
square(i) = w(i) * h(i);%计算每个连通区域的面积
if square(i) > AERAMAX%如果一个连通区域的面积大于设定面积,那么说明这个区域中的物体时运动员
for i=1:length(r)
I_gray_filter2(r(i),c(i)) = 0;
end
end
end

figure;
subplot(131);imshow(I_gray_filter2);title('去掉大面积的效果');



%step2:由于图形处理时,会出现部分细小的间隔的图,这种情况视为图形处理导致的误差,所以进行合并
%step2:由于图形处理时,会出现部分细小的间隔的图,这种情况视为图形处理导致的误差,所以进行合并
%step2:由于图形处理时,会出现部分细小的间隔的图,这种情况视为图形处理导致的误差,所以进行合并

step1 = 2;%合并区域的间隔大小
step2 = 2;%合并区域的间隔大小
for i = 1:rows-step1
for j =1:cols-step2
if I_gray_filter2(i,j) > 0 & I_gray_filter2(i+step1,j) > 0
I_gray_filter2(i:i+step1,j) = I_gray_filter2(i,j);%行范围合并
end
if I_gray_filter2(i,j) > 0 & I_gray_filter2(i,j+step2) > 0
I_gray_filter2(i,j:j+step2) = I_gray_filter2(i,j);%列范围合并
end
end
end

subplot(132);imshow(I_gray_filter2);title('合并邻近区域');


%step3:将面积较小的区域视为缺陷部分,直接去除处理
%step3:将面积较小的区域视为缺陷部分,直接去除处理
%step3:将面积较小的区域视为缺陷部分,直接去除处理
[L,n] = bwlabel(I_gray_filter2);%计算连通区域的个数
index = 0;
L2 = zeros(rows,cols);
L3 = zeros(rows,cols);
for i=1:n
[r,c] = find(L==i); %计算每个连通区域的坐标值
a1(i) = max(r); a2(i) = min(r); %X坐标
b1(i) = max(c); b2(i) = min(c); %y坐标
w(i) = b1(i)-b2(i); %连通区域的行范围
h(i) = a1(i)-a2(i); %连通区域的列范围
%计算占用面积
square(i) = w(i) * h(i);%计算每个连通区域的面积
if square(i) < sel_area2%如果一个连通区域的面积大于设定面积,那么说明这个区域中的物体时运动员
for i=1:length(r)
I_gray_filter2(r(i),c(i)) = 0;
end
end
end

subplot(133);imshow(I_gray_filter2);title('去掉小面积的效果');



%step4:提取芯片的管脚
%step4:提取芯片的管脚
%step4:提取芯片的管脚

%提取可能得焊接点,去除其他额外的错误信息
%得到合适的联通区域

[L,n] = bwlabel(I_gray_filter2);%计算连通区域的个数
index = 0;
L2 = zeros(rows,cols);
L3 = zeros(rows,cols);
for i=1:n
[r,c] = find(L==i); %计算每个连通区域的坐标值
a1(i) = max(r); a2(i) = min(r); %X坐标
b1(i) = max(c); b2(i) = min(c); %y坐标


w(i) = b1(i)-b2(i); %连通区域的行范围
h(i) = a1(i)-a2(i); %连通区域的列范围
%计算占用面积
square(i) = w(i) * h(i);%计算每个连通区域的面积
index = index + 1;
%下面四行代码是对分割边框的描述
L2(a2(i)+1:a2(i)+2,b2(i)+1:b1(i),1) = 255;
L2(a2(i)+1:a2(i)+2,b2(i)+1:b1(i),2) = 0;
L2(a2(i)+1:a2(i)+2,b2(i)+1:b1(i),3) = 0;

L2(a1(i)+1:a1(i)+2,b2(i)+1:b1(i),1) = 255;
L2(a1(i)+1:a1(i)+2,b2(i)+1:b1(i),2) = 0;
L2(a1(i)+1:a1(i)+2,b2(i)+1:b1(i),3) = 0;

L2(a2(i)+1:a1(i) ,b2(i)+1:b2(i)+2,1) = 255;
L2(a2(i)+1:a1(i) ,b2(i)+1:b2(i)+2,2) = 0;
L2(a2(i)+1:a1(i) ,b2(i)+1:b2(i)+2,3) = 0;

L2(a2(i)+1:a1(i) ,b1(i)+1:b1(i)+2,1) = 255;
L2(a2(i)+1:a1(i) ,b1(i)+1:b1(i)+2,2) = 0;
L2(a2(i)+1:a1(i) ,b1(i)+1:b1(i)+2,3) = 0;
%计算每个分割区域的中心坐标值
Xcenters(i) = round((a2(i)+a1(i))/2);
Ycenters(i) = round((b2(i)+b1(i))/2);
L3(Xcenters(i)-1:Xcenters(i)+1,Ycenters(i)-1:Ycenters(i)+1,1) = 255;
L3(Xcenters(i)-1:Xcenters(i)+1,Ycenters(i)-1:Ycenters(i)+1,2) = 0;
L3(Xcenters(i)-1:Xcenters(i)+1,Ycenters(i)-1:Ycenters(i)+1,3) = 0;
%产生分割矩形
end
for i = 1:rows
for j = 1:cols
if L3(i,j,1) == 255 %如果L2=255,即如果是视频的分割部分,那么输出的最后的视频为分割方框
pixel2(i,j,1) = L3(i,j,1);%R
pixel2(i,j,2) = L3(i,j,2);%G
pixel2(i,j,3) = L3(i,j,3);%B
pixel3(i,j,1) = L3(i,j,1);%R
pixel3(i,j,2) = L3(i,j,2);%G
pixel3(i,j,3) = L3(i,j,3);%B
else
pixel2(i,j,:) = I(i,j,:);%如果不是分割的方框,那么直接输出视频
pixel3(i,j,:) = I_gray_filter2(i,j,:);%如果不是分割的方框,那么直接输出视频
end
end
end
figure;
subplot(121);imshow(pixel2);title('芯片管脚的定位效果图');
subplot(122);imshow(pixel3);title('芯片管脚的定位效果图');
%step5:利用视觉效果处理,计算每个定位点下面的区域的面积和周长
%step5:利用视觉效果处理,计算每个定位点下面的区域的面积和周长
%step5:利用视觉效果处理,计算每个定位点下面的区域的面积和周长
[L,n] = bwlabel(I_gray_filter2);%计算连通区域的个数
%SSS = zeros(rows,cols);
for i=1:n
[r,c] = find(L==i); %计算每个连通区域的坐标值
a1(i) = max(r); a2(i) = min(r); %X坐标
b1(i) = max(c); b2(i) = min(c); %y坐标
[rectx,recty,area,perimeter] = func_detect(c,r,'p');
S_check(i) = area;
for i=1:length(r)
SSS(r(i),c(i)) = 255;
end
end
up25

三、测试结果

 

 

 

 

 

 

 

 

posted @ 2022-12-24 23:10  fpga和matlab  阅读(198)  评论(0编辑  收藏  举报