Fit ellipse to objects in image

20 visualizaciones (últimos 30 días)
Sean Dobson
Sean Dobson el 7 de En. de 2022
Comentada: Sean Dobson el 10 de En. de 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)
BW = imbinarize(rgb2gray(imread(file_name)),0.68);
[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

Respuesta aceptada

Kevin Holly
Kevin Holly el 7 de En. de 2022
I would suggest using regionprops. Steve Eddins walks through the process on his blog.
  2 comentarios
Kevin Holly
Kevin Holly el 7 de En. de 2022
regionprops also can provide the eccentricity value.
Sean Dobson
Sean Dobson el 10 de En. de 2022
Thank you for your help!

Iniciar sesión para comentar.

Más respuestas (2)

Matt J
Matt J el 7 de En. de 2022
Editada: Matt J el 7 de En. de 2022
T=regionprops('table',~BW,'MajorAxisLength','MinorAxisLength','Eccentricity');
meanEccentricity=mean(T.Eccentricity);
Areas=pi*T.MajorAxis.Length*T.MinorAxisLength/4;

Matt J
Matt J el 7 de En. de 2022
Editada: Matt J el 7 de En. de 2022
You cna use ellipticalFit(), distributed here:
BW0 = imbinarize(rgb2gray(imread('https://www.mathworks.com/matlabcentral/answers/uploaded_files/856545/image.jpeg')),0.68);
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)

Categorías

Más información sobre Feature Detection and Extraction en Help Center y File Exchange.

Etiquetas

Productos


Versión

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by