我怎么能算不上。使用matlab形态算子对图像中的孔进行测量并测量它们的直径?

时间:2016-07-01 10:49:08

标签: matlab image-processing

所以我有一个graylevel图像,演示了一个电子电路卡,我应该检查孔的数量和孔的直径,我也允许在Matlab中使用形态学运算符。图像如下:

pcb.jpg

我可以编写一些可以计算孔数的代码,但我不知道如何测量它们的直径!

clear; close all; clc; warning off

im = imread('input\pcb.jpg');
im1 = im2bw(im,0);
% im1 = ~im2bw(im,0);
figure; imshow(im1);

strel1 = strel('disk',2);
im2 = imclose(im1,strel1);
figure; imshow(im2);

im3 = imfill(im2,'holes');
figure; imshow(im3);

im4 = im3 & ~im1;
figure; imshow(im4);

strel2 = strel('disk',3);
im5 = imopen(im4,strel2);
figure; imshow(im5);

[~,numCC] = bwlabel(im5);
fprintf('Number of holes equals:\t%d\n',numCC);

我提前感谢任何评论!

1 个答案:

答案 0 :(得分:1)

最后我写了一些代码,似乎它的工作方式完美无缺! 实际上,孔的数量计为4,它们的直径不是精确的,但它们是使用内置的MATLAB函数近似的。问题是其中一个洞没有明显分开!它会估算结果......

clear; close all; clc; warning off

im = imread('input\pcb.jpg');
level = graythresh(im);
imBin = im2bw(im,level);
figure(1); imshow(imBin); title('Binarized Original Image');
imBinInv = ~imBin;
figure(2); imshow(imBinInv); title('Inverted Binarized Original Image');

imInvHolSep = imdilate(imerode(imBinInv,strel('disk',21)),strel('disk',23));
figure(3); imshow(imInvHolSep); title('Inverted Holes Separated');

imInHolSepBound = imInvHolSep & ~imerode(imInvHolSep,strel('disk',2));
figure(4); imshow(imInHolSepBound); title('Inverted Holes Boundaries');

imInvHolSepFill = imfill(imInHolSepBound,'holes');
figure(5); imshow(imInvHolSepFill); title('Inverted Holes Filled After Setting Boundaries');

imInvHolSepDist = imerode(imInvHolSepFill,strel('disk',1));
figure(6); imshow(imInvHolSepDist); title('Inverted Holes Eroded Just For The Case of Indistinct Hole');

imInvHolSepMinus = imInvHolSepDist & ~imBin;
figure(7); imshow(imInvHolSepMinus); title('Inverted Holes Minus The Inverted Binarized Image');

imInvHolSepSmooth = imdilate(imInvHolSepMinus,strel('disk',2));
figure(8); imshow(imInvHolSepSmooth); title('Final Approximated Inverted Holes Smoothed');

[~,numCC] = bwlabel(imInvHolSepSmooth);
fprintf('Number of holes equals:\t%d\n',numCC);

stats = regionprops(imInvHolSepSmooth);
centroid = zeros(length(stats),2);
area = zeros(length(stats),1);
for c1 = 1:length(stats)
    centroid(c1,:) = stats(c1).Centroid;
    area(c1) = stats(c1).Area;
    fprintf('Diameter of the hole with centroid coordinates [%.2f, %.2f] is:\t%.2f\n',centroid(c1,1),centroid(c1,2),sqrt(area(c1)/pi));
end