sana
sana

Reputation: 408

Segment out those objects that have holes in it

I have a binary image, that has circles and squares in it.

enter image description here

imA = imread('blocks1.png');

A = im2bw(imA);

figure,imshow(A);title('Input Image - Blocks');
imBinInv = ~A;
figure(2); imshow(imBinInv); title('Inverted Binarized Original Image');

Some circles and squares have small holes in them based on which, I have to generate an image which has only those circles and squares that have holes/missing point in them. How can I code that?

PURPOSE: Later on, using regionprops in MATLAB, I will extract the information that from those objects, how many are circles and squares.

Upvotes: 4

Views: 1563

Answers (2)

Tapio
Tapio

Reputation: 1642

You should use the Euler characteristic. It's a topological invariant which describes the amount of holes in a object in the 2D case. You can calculate it using regionprops too:

STATS = regionprops(L, 'EulerNumber');

Any single object with no holes will have an Euler characteristic of 1, any single object with 1 hole will have an Euler characteristic of 0, two holes -> -1 etc. So you can segment out all the objects with EC < 1. It's pretty fast to calculate too.

imA = imread('blocks1.png');

A = logical(imA);
L = bwlabel(A); %just for visualizing, you can call regionprops straight on A

STATS = regionprops(L, 'EulerNumber');

holeIndices = find( [STATS.EulerNumber] < 1 ); 

holeL = false(size(A));
for i = holeIndices
    holeL( L == i ) = true;
end

Output holeL:

enter image description here

Upvotes: 2

Leander Moesinger
Leander Moesinger

Reputation: 2462

There might be a faster way, but this should work:

Afilled = imfill(A,'holes'); % fill holes
L = bwlabel(Afilled); % label each connected component
holes = Afilled - A; % get only holes
componentLabels = unique(nonzeros(L.*holes)); % get labels of components which have at least one hole
A = A.*L; % label original image
A(~ismember(A,componentLabels)) = 0; % delete all components which have no hole
A(A~=0)=1; % turn back from labels to binary - since you are later continuing with regionprops you maybe don't need this step.

Upvotes: 1

Related Questions