首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我怎样才能检测到半导体图像中的缺陷?

我怎样才能检测到半导体图像中的缺陷?
EN

Stack Overflow用户
提问于 2019-12-28 16:51:57
回答 2查看 435关注 0票数 5

所以我有一个半导体晶片的图像,它有一个缺陷,我需要用Matlab来检测。我只应该探测到它,而不是它的背景。我还要测量它的周长和面积。

到目前为止,我有这样的代码,我将原始图像转换为二值图像,然后对其使用扩展,然后尝试得到它的轮廓。当得到周边和面积,我收到的结果不仅是因为缺陷,但其他的图像,这不是我想要的。如何只提取缺陷,才能得到它的面积和参数。

图片:

代码语言:javascript
复制
fig3 = imread('figure3.png');
imshow(fig3);

title('Original image', 'FontSize', 18);
%Gray image
fig3Gray = rgb2gray(fig3);



%Binary image
BW3 = imbinarize(fig3Gray,0.5);
imshow(BW3);
title('Binary image', 'FontSize', 18);

se3 = strel('square',5);

%Dilation image
dilated3 = imdilate(BW3,sr);
imshow(dilated3);
title('Dilated image', 'FontSize', 18);

minus3 = ~(BW3-dilated3);
imshow(minus3);
title('Contour image', 'FontSize', 18);
imshowpair(minus3,BW3,'montage');

%Perimeter and Area calculation
Coon3 = bwconncomp(~BW3)
ANS3 = length(Coon3.PixelIdxList{1});
OUTPUT3 = regionprops(Coon3,'Perimeter','Area');
P3 = OUTPUT3.Perimeter
Area3 = OUTPUT3.Area
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-28 22:16:20

这个问题比你的previous question难得多。

  • 下面的解决方案使用一种迭代方法(两次迭代)。
  • 包含了关于集群与其邻居之间的区别的启发式方法。
  • 包含一个启发式,即集群不能太高或太长。

请阅读评论:

代码语言:javascript
复制
clear

fig3 = imread('figure3.png');
fig3Gray = rgb2gray(fig3);
fig3Gray = im2double(fig3Gray); %Convert from uint8 to double (MATLAB math works in double).

%figure;imshow(fig3Gray);

%Apply median filter with large radius.
Med = medfilt2(fig3Gray, [51, 51], 'symmetric');
%figure;imshow(Med);

D = abs(fig3Gray - Med);
%figure;imshow(D);impixelinfo

BW = imbinarize(D, 0.3);
%figure;imshow(BW);impixelinfo

Coon = bwconncomp(BW);

fig3GrayMasked = fig3Gray;

%Cover the tall clusters and the long clusters.
for i = 1:length(Coon)
    C = Coon.PixelIdxList{i}; %Cluster coordinates.
    [Y, X] = ind2sub(size(fig3Gray), C); %Convert to x,y indices.
    is_tall = (max(Y) - min(Y)) > 50; %true if cluster is tall.
    is_wide = (max(X) - min(X)) > 50; %true if cluster is wide.

    %Replace tall and long clusters by pixels from median image.
    if ((is_tall) || (is_wide))
        fig3GrayMasked(C) = Med(C);
    end
end

%figure;imshow(fig3GrayMasked);impixelinfo

%Second iteration: search largest cluster on fig3GrayMasked image.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Med = medfilt2(fig3GrayMasked, [51, 51], 'symmetric');

D = abs(fig3GrayMasked - Med);
%figure;imshow(D);impixelinfo

BW = imbinarize(D, 0.3);
%figure;imshow(BW);impixelinfo

Coon = bwconncomp(BW);

%Find index of largest cluster in list of clusters Coon.PixelIdxList
[~, i] = max(cellfun(@numel, Coon.PixelIdxList));

%Get the indices of the largest cluster
C = Coon.PixelIdxList{i};
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%Paint cluster in yellow color (just for fun).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
BW = zeros(size(BW), 'logical');
BW(C) = 1;
Y = im2uint8(cat(3, ones(size(BW)), ones(size(BW)), zeros(size(BW))));
fig3(cat(3, BW, BW, BW)) = Y(cat(3, BW, BW, BW));
figure;imshow(fig3)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

结果:

票数 5
EN

Stack Overflow用户

发布于 2019-12-28 21:30:39

让我们从读取图像并将其转换为二进制开始。请注意,我降低了门槛,以消除不必要的细节。

代码语言:javascript
复制
clear; close all; clc

fig3 = imread('XEQ59.png');
imshow(fig3);

title('Original image', 'FontSize', 18);
%Gray image
fig3Gray = rgb2gray(fig3);
%Binary image
BW3 = imbinarize(fig3Gray, 0.2); % lowered threshold
figure; imshow(BW3)
title('binary image')

现在我们继续寻找缺陷的坐标。为此,我们定义了一个结构元素,它定义了我们想要的形状se

我们正在寻找与se匹配的图像中的部分。若要匹配给定的坐标,其周围区域必须是se

注意,这里的灰色值被忽略了,它们可以是白色的,也可以是黑色的。

se是手动定义的,其中1表示白色,-1表示黑色,0表示被忽略的像素。

代码语言:javascript
复制
% hit-miss
se = [1, 1, -1*ones(1,5), ones(1, 3); ...
      ones(6,1), -1*ones(6), zeros(6,2), ones(6,1); ...
      ones(3,2), zeros(3,1), -1*ones(3,6), ones(3,1)];
figure; imshow(uint8(255/2*(se+1)), 'InitialMagnification', 3000)
title('structuring element')

应用命中-误操作找到缺陷的位置:

代码语言:javascript
复制
pos = bwhitmiss(BW3, se);
figure; imshow(pos)
title('position of defect')
input('Press enter to continue...')

既然我们有了这个位置,我们就会把这个特定的像素位置增大,直到它不再生长,以获得缺陷。

代码语言:javascript
复制
% get the defect
close all; clc
def = pos;
last_def = zeros(size(def));
while ~isequal(def, last_def)
    last_def = def;
    def = ~BW3 & imdilate(def, ones(3));
    imshow(def)
    title('defect')
    pause(0.1)
end

计算面积和周长:

代码语言:javascript
复制
% area
area = sum(def(:))

% perimeter
vert = imdilate(def, [1; 1; 1]) - def;
horz = imdilate(def, [1 1 1]) - def;
perimeter = sum(vert(:)) + sum(horz(:))
代码语言:javascript
复制
area =
   102
perimeter =
    54
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59512922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档