How to fit an ellipse to an image in matlab.

35 ビュー (過去 30 日間)
Hardit Singh
Hardit Singh 2019 年 12 月 9 日
コメント済み: Connor 2023 年 11 月 11 日
diskimage1.jpgI 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.

採用された回答

Akira Agata
Akira Agata 2019 年 12 月 11 日
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)
untitled.png
  11 件のコメント
Image Analyst
Image Analyst 2023 年 11 月 10 日
@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);
Connor
Connor 2023 年 11 月 11 日
Thanks!

サインインしてコメントする。

その他の回答 (2 件)

Image Analyst
Image Analyst 2019 年 12 月 11 日

Matt J
Matt J 2023 年 11 月 10 日
編集済み: Matt J 2023 年 11 月 10 日
You can use ellipticalFit from this FEX download
processImage('Connors_image.png')
ans =
ellipticalFit with properties: center: [196.4747 218.0069] a: 130.0274 b: 119.1008 angle: 3.0398
processImage('Hardits_image.png')
ans =
ellipticalFit with properties: center: [171.3735 173.6428] a: 112.7502 b: 104.1636 angle: 47.0771
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
  1 件のコメント
Connor
Connor 2023 年 11 月 11 日
Thanks!

サインインしてコメントする。

製品


リリース

R2016b

Community Treasure Hunt

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

Start Hunting!

Translated by