# Identifying Round Objects

This example shows how to classify objects based on their roundness using bwboundaries, a boundary tracing routine.

imshow(RGB)

### Step 2: Threshold the Image

Convert the image to black and white in order to prepare for boundary tracing using bwboundaries.

I = im2gray(RGB);
bw = imbinarize(I);
imshow(bw)

### Step 3: Preprocess the Image

Using morphology functions, remove pixels which do not belong to the objects of interest.

Remove all objects containing fewer than 30 pixels.

minSize = 30;
bw = bwareaopen(bw,minSize);
imshow(bw)

Fill a gap in the pen's cap.

se = strel("disk",2);
bw = imclose(bw,se);
imshow(bw)

Fill any holes, so that regionprops can be used to estimate the area enclosed by each of the boundaries

bw = imfill(bw,"holes");
imshow(bw)

### Step 4: Find the Boundaries

Concentrate only on the exterior boundaries. Specifying the "noholes" option will accelerate the processing by preventing bwboundaries from searching for inner contours.

[B,L] = bwboundaries(bw,"noholes");

Display the label matrix and draw each boundary.

imshow(label2rgb(L,@jet,[.5 .5 .5]))
hold on
for k = 1:length(B)
boundary = B{k};
plot(boundary(:,2),boundary(:,1),"w",LineWidth=2)
end
title("Objects with Boundaries in White")

### Step 5: Determine which Objects are Round

Estimate the circularity and centroid of all of the objects using the regionprops function. The circularity metric is equal to 1 for an ideal circle and it is less than 1 for other shapes.

stats = regionprops(L,"Circularity","Centroid");

The classification process can be controlled by setting an appropriate threshold. In this example, use a threshold of 0.94 so that only the pills will be classified as round.

threshold = 0.94;

Loop over the detected boundaries. For each object:

• Obtain the (x,y) boundary coordinates and the circularity measurement

• Compare the circularity measurement to the threshold. If the circularity exceeds the threshold, calculate the position of the centroid and display the centroid as a black circle.

• Display the circularity measurement in yellow text over the object.

for k = 1:length(B)

% Obtain (X,Y) boundary coordinates corresponding to label "k"
boundary = B{k};

% Obtain the circularity corresponding to label "k"
circ_value = stats(k).Circularity;

% Display the results
circ_string = sprintf("%2.2f",circ_value);

% Mark objects above the threshold with a black circle
if circ_value > threshold
centroid = stats(k).Centroid;
plot(centroid(1),centroid(2),"ko");
end

text(boundary(1,2)-35,boundary(1,1)+13,circ_string,Color="y",...
FontSize=14,FontWeight="bold")

end
title("Centroids of Circular Objects and Circularity Values")