Fit ellipse to objects in image

조회 수: 19 (최근 30일)
Sean Dobson
Sean Dobson 2022년 1월 7일
댓글: Sean Dobson 2022년 1월 10일
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

채택된 답변

Kevin Holly
Kevin Holly 2022년 1월 7일
I would suggest using regionprops. Steve Eddins walks through the process on his blog.
  댓글 수: 2
Kevin Holly
Kevin Holly 2022년 1월 7일
regionprops also can provide the eccentricity value.
Sean Dobson
Sean Dobson 2022년 1월 10일
Thank you for your help!

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Matt J
Matt J 2022년 1월 7일
편집: Matt J 2022년 1월 7일
T=regionprops('table',~BW,'MajorAxisLength','MinorAxisLength','Eccentricity');
meanEccentricity=mean(T.Eccentricity);
Areas=pi*T.MajorAxis.Length*T.MinorAxisLength/4;
  댓글 수: 1
Sean Dobson
Sean Dobson 2022년 1월 10일
Thank you for your help!

댓글을 달려면 로그인하십시오.


Matt J
Matt J 2022년 1월 7일
편집: Matt J 2022년 1월 7일
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)

카테고리

Help CenterFile Exchange에서 Feature Detection and Extraction에 대해 자세히 알아보기

제품


릴리스

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by