pcb板缺陷检测是图像分析的一个典型应用方向。这次我用matlab来把整个流程实现一遍。
PCB板检测的大概流程如下:首先存储一个标准PCB板图像作为参考标准,然后将待检测的PCB板图像进行处理,比较与标准PCB图像的差异。根据差异的情况来判断缺陷类型。
(1)图像预处理
对于标准PCB板的图像处理包括:灰度化,二值化。而对待检测图像的处理则包括:
灰度化,滤波,除去黑点等。二者最终都会得到各自的二值图像。
function tgtImg = pre_process(srcImg)
srcImg_gray = rgb2gray(srcImg);
src_med = medfilt2(srcImg_gray);
src_bw = im2bw(src_med);
src_spur = bwmorph(src_bw,'spur',8);
src_fill = bwmorph(src_spur,'fill');填充孤立黑点
tgtImg = bwmorph(src_fill,'clean');
end
function tgtImg = getBW(srcImg)
srcImg_gray = rgb2gray(srcImg);
srcImg_bw = im2bw(srcImg_gray);
tgtImg = srcImg_bw;
end
对处理后的结果进行显示:
std_rgb = imread('standard.jpg');
figure()
imshow(std_rgb);
title('标准图');
stdImg = getBW(std_rgb);
figure()
imshow(stdImg);
title('标准图二值化');
src_rgb = imread('untreated.jpg');
figure()
imshow(src_rgb);
title('待检测图');
srcImg = pre_process(src_rgb);
figure()
imshow(srcImg);
title('待检测图二值化');
标准图像与检测图像如下:
(2)图像匹配
图像匹配是对不同时间、不同传感器或者不同视角下的同一场景的两幅或者多幅图像进行配准的过程。常用的图像配准方法有基于特征的图像配准和基于互信息的配准。
互相关配准要求要求参考图像和待匹配图像在尺度和灰度值上相差不大。检测PCB板符合这一要求。该方法的主要思想是:利用待匹配图像上所选取的区域在参考模板进行遍历,计算每个位置的互相关系数,根据互相关的最大值来确定匹配的位置。
由上述图片可知,待测图像存在与标准图像存在角度差。我们可以在进行互相关系数计算前,先进性旋转,求出在多个角度下的最大相关系数,则该相关系数时的角度即为两幅图像的角度差,对待测图像进行旋转,然后根据最大相关系数进行旋转后的待测图像与标准图像进行匹配。
function tgtImg = roateImg(stdImg,srcImg)
src_rect=[80 370 150 130];
std_rect=[40 320 200 190];
std_sub=imcrop(stdImg,std_rect);
max_c=0;
for rr=-2:1:2
src_rot=imrotate(srcImg,rr,'nearest');
src_sub=imcrop(src_rot,src_rect);
c=normxcorr2(src_sub,std_sub);
[max_c1,imax1]=max(abs(c(:)));
if(max_c1>max_c)
max_c=max_c1;
angle=rr;
end
end
src_tz=imrotate(srcImg,angle,'nearest');
src_tz_sub=imcrop(src_tz,src_rect);
cc=normxcorr2(src_tz_sub,std_sub);
[max_cc,imax]=max(abs(cc(:)));
[ypeak,xpeak]=ind2sub(size(cc),imax);
yd=[ypeak-(src_rect(4)+1) xpeak-(src_rect(3)+1)];
std_dc=[yd(1)+std_rect(2) yd(2)+std_rect(1)];
xz=[std_dc(1)-src_rect(2) std_dc(2)-src_rect(1)];
dc_qu_rect=[1-xz(2) 1-xz(1) size(stdImg,2)-1 size(stdImg,1)-1];
dc_qu=imcrop(src_tz,dc_qu_rect);
tgtImg = dc_qu;
end
旋转后的图像如下:
(3)待测PCB图像缺陷标记
将经过配准的待测图像与标准图像进行异或运算,即可得到缺陷部分,经过形态学处理,对缺陷部分进行标记。
function tgtImg = xorImg(stdImg,srcImg,std_rgb)
ImgXor=xor(stdImg,srcImg);
MN=[3 3];
se=strel('rectangle',MN);
imr=imerode(ImgXor,se);
imd=imdilate(imr,se);
rgb=label2rgb(imd,@autumn,'g');
tgtImg=imlincomb(.6,rgb,.4,std_rgb);
end
所得到的图像如下:
至此,我们已经将图像的缺陷部分标记了出来。如果要进一步地判断缺陷类型,则需要做对两幅图像相减,并根据相减后的情况进行判断。