Fit ellipse to objects in image
20 次查看(过去 30 天)
显示 更早的评论
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
0 个评论
采纳的回答
Kevin Holly
2022-1-7
I would suggest using regionprops. Steve Eddins walks through the process on his blog.
2 个评论
更多回答(2 个)
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)
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Feature Detection and Extraction 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!