Identifying Round Objects
This example shows how to classify objects based on their roundness using bwboundaries
, a boundary tracing routine.
Step 1: Read an Image
Read in pills_etc.png
.
RGB = imread("pillsetc.png");
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")
See Also
bwboundaries
| imbinarize
| bwareaopen
| imclose
| strel
| imfill
| label2rgb
| regionprops