# Fit ellipse to objects in image

27 views (last 30 days)
Sean Dobson on 7 Jan 2022
Commented: Sean Dobson on 10 Jan 2022
Hello, I am trying to fit ellipses to many different objects within a binary images. The ultimate goal is calculate the average eccentricity of the objects, but I can currently only plot a boundary around the objects. Any suggestions would be much appreciated. Image below (metallic sample with visible porosity). clear
clc
close all
[f,p]=uigetfile('*.tif','select image file');
file_name=strcat(p,f)
[B,L,N,A] = bwboundaries(BW);
figure; imshow(BW); hold on;
% Loop through object boundaries
for k = 1:N
% Boundary k is the parent of a hole if the k-th column
% of the adjacency matrix A contains a non-zero element
if (nnz(A(:,k)) > 0)
boundary = B{k};
% Loop through the children of boundary k
area1=polyarea(boundary(:,2), boundary(:,1));
for l = find(A(:,k))'
boundary = B{l};
plot(boundary(:,2),...
boundary(:,1),'g','LineWidth',2);
areaholes(l)=polyarea(boundary(:,2), boundary(:,1));
end
end
end

Kevin Holly on 7 Jan 2022
I would suggest using regionprops. Steve Eddins walks through the process on his blog.
##### 2 CommentsShowHide 1 older comment
Sean Dobson on 10 Jan 2022

Matt J on 7 Jan 2022
Edited: Matt J on 7 Jan 2022
T=regionprops('table',~BW,'MajorAxisLength','MinorAxisLength','Eccentricity');
meanEccentricity=mean(T.Eccentricity);
Areas=pi*T.MajorAxis.Length*T.MinorAxisLength/4;
Sean Dobson on 10 Jan 2022

Matt J on 7 Jan 2022
Edited: Matt J on 7 Jan 2022
You cna use ellipticalFit(), distributed here:
BW=bwareaopen(~BW0,15);
B=bwboundaries(BW,'noholes');
figure; imshow(BW0); hold on;
% Loop through object boundaries
N=numel(B);
for k = 1:N
efit=ellipticalFit(flipud(B{k}.'));
hold on
fimplicit(efit,'Color','r','LineWidth',3);
hold off
areaholes(k)=pi*efit.a*efit.b/4;
end
axis([0.0070 0.7170 0.7402 1.2728]*1000) R2021a

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!