How to fit an ellipse to an image in matlab.
70 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Hardit Singh
am 9 Dez. 2019
Kommentiert: Connor
am 11 Nov. 2023
I have a image like this and I want to fit an ellipse around this disk image and get the info about the ellipse like its axis, center point, etc. I am unsure how to use the image proccessing toolbox to draw an ellipse to it and get info about the ellipse.
0 Kommentare
Akzeptierte Antwort
Akira Agata
am 11 Dez. 2019
How about the following?
% Read image
I = imread('diskimage1.jpeg');
% Binarize
Igray = rgb2gray(I);
BW = imbinarize(Igray);
% Extract the maximum area
BW = imclearborder(BW);
BW = bwareafilt(BW,1);
% Calculate centroid, orientation and major/minor axis length of the ellipse
s = regionprops(BW,{'Centroid','Orientation','MajorAxisLength','MinorAxisLength'});
% Calculate the ellipse line
theta = linspace(0,2*pi);
col = (s.MajorAxisLength/2)*cos(theta);
row = (s.MinorAxisLength/2)*sin(theta);
M = makehgtform('translate',[s.Centroid, 0],'zrotate',deg2rad(-1*s.Orientation));
D = M*[col;row;zeros(1,numel(row));ones(1,numel(row))];
% Visualize the result
figure
imshow(Igray)
hold on
plot(D(1,:),D(2,:),'r','LineWidth',2)
11 Kommentare
Image Analyst
am 10 Nov. 2023
@Connor that is not a blob. Well it is but it's a very snake-like, line-like blob. So the fit is accurate. But I suspect what you want is to fit the (x,y) coordinates of the blob to an ellipse. So you need to get x and y from the binary image like this:
[y, x] = find(binaryImage);
and then use the ellipse fit in the FAQ: https://matlab.fandom.com/wiki/FAQ#How_can_I_fit_an_ellipse_or_other_shape_to_a_set_of_XY_data?
Weitere Antworten (2)
Image Analyst
am 11 Dez. 2019
See Steve's blog: Visualizing regionprops ellipse measurements
0 Kommentare
Matt J
am 10 Nov. 2023
Bearbeitet: Matt J
am 10 Nov. 2023
You can use ellipticalFit from this FEX download
processImage('Connors_image.png')
processImage('Hardits_image.png')
function e=processImage(filename)
I = imread(filename);
% Binarize
I = bwareafilt(imclearborder(imbinarize(rgb2gray(I))),1);
b = bwboundaries(I);
e=ellipticalFit(flipud(b{1}'));
imshow(I,[]); hold on
showfit(e,'LineWidth',1,'Color','r','LineStyle','--'); hold off
end
Siehe auch
Kategorien
Mehr zu Biomedical Imaging finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!