clc;
clear;
close all;
warning off;
addpath(genpath(pwd));
%% 参数初始化
ifnoise = 1 ;%加入噪声模拟
noise_level = 0.02 ;%噪声大小
area = 3 ;%滤波
area2 = 1 ;%平滑
sel_area2 = 0;
%以下几个参数需要不断的调整才行
bw_para = 90; %二值化门限,这个值取决于照片光线的强度%1.jpg:90,2.jpg:90
AERAMAX = 10000;%对于处理面积巨大的,视为光线效果,去除,这个值取决于图片的大小,是个相对值
errors = 700; %检测异常值,这个值也取决于图片大小以及芯片管脚的大小。
%% 读取图片
I = imread('image\2.jpg');
figure
subplot(231);imshow(I);title('01:待检芯片');
%% 图像预处理
%% 图像预处理
%% 图像预处理
%% 图像预处理
%step1:灰度图
%step1:灰度图
%step1:灰度图
if size(I,3) == 3%判断是否是RGB图
I_gray = rgb2gray(I);
else
I_gray = I;
end
subplot(232);imshow(I_gray);title('02:待检芯片灰度图');
%step2:去噪,采用中值滤波算法
%step2:去噪,采用中值滤波算法
%step2:去噪,采用中值滤波算法
if ifnoise == 1%判断是否需要人为模拟噪声
I_gray_noise = imnoise(I_gray,'salt & pepper',noise_level);
else
I_gray_noise = I_gray;
end
I_gray_filter= medfilt2(I_gray_noise,[area area]);%进行中值滤波
subplot(233);imshow(I_gray_noise);title('03:带噪声图像');
subplot(234);imshow(I_gray_filter);title('04:滤波之后的图像');
%step3:二值化
%step3:二值化
%step3:二值化
[r,c] = size(I_gray_filter);
bw_I_gray_filter = zeros(r,c);
bw_I_gray_filter(find(I_gray_filter > bw_para)) = 255;
subplot(235);imshow(bw_I_gray_filter);title('05:二值化参数');
%step4:平滑处理
%step4:平滑处理
%step4:平滑处理
I_gray_filter2 = medfilt2(bw_I_gray_filter,[area2 area2]);%进行中值滤波
subplot(236);imshow(I_gray_filter2);title('06:带噪声滤波后图像');
rows = size(I_gray_filter2,1); %240%计算视频的行数
cols = size(I_gray_filter2,2); %320 %计算视频的列数
%% 芯片缺陷检测
%% 芯片缺陷检测
%% 芯片缺陷检测
%% 芯片缺陷检测
%step1:将面积巨大的区域视为光线影响,将其背景化
%step1:将面积巨大的区域视为光线影响,将其背景化
%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
%figure;
%imshow(SSS);title('芯片缺陷定位效果图');
L4 = zeros(rows,cols);
index2 = 0;
for i=1:n
if S_check(i) > errors
index2 = index2 +1;
L4(a2(i)+1:a2(i)+2,b2(i)+1:b1(i),1) = 255;
L4(a2(i)+1:a2(i)+2,b2(i)+1:b1(i),2) = 0;
L
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
1.版本:matlab2017b,包含仿真操作录像,操作录像使用windows media player播放。 2.领域:芯片电路图焊接锡点缺陷检测 3.内容:基于形态学处理的芯片电路图焊接锡点缺陷检测matlab仿真 %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); %连通区域的行范围 4.注意事项:注意MATLAB左侧当前文件夹路径,必须是程序所在文件夹位置,具体可以参考视频录。
资源推荐
资源详情
资源评论
收起资源包目录
基于形态学处理的芯片电路图焊接锡点缺陷检测matlab仿真.rar (16个子文件)
00025_基于形态学处理的芯片电路图焊接锡点缺陷检测matlab仿真
untitled3.jpg 22KB
untitled2.jpg 24KB
untitled1.jpg 16KB
MATLAB
image
2.jpg 11KB
6.jpg 50KB
1.jpg 11KB
5.jpg 16KB
8.jpg 25KB
3.jpg 8KB
7.jpg 6KB
9.jpg 14KB
4.jpg 19KB
main.m 9KB
func_detect.m 3KB
untitled4.jpg 14KB
操作录像0039.avi 5.68MB
共 16 条
- 1
fpga和matlab
- 粉丝: 15w+
- 资源: 2544
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页