图片缩略图

fit_ellipse

version 1.0.0.0 (4.19 KB) by 阿加
用给定的点集(闭合轮廓)找到最适合椭圆的点。
4.8
78年评级

102下载

更新2003年10月02

查看许可协议

这个函数使用最小二乘准则估计从给定的点集(x,y)到椭圆的最佳拟合。对具有可能倾斜的椭圆的圆锥表示进行了最小二乘估计。

圆锥椭圆表示= a*x^2+b*x*y+c*y^2+d*x+e*y+f=0
(当x*y存在时,椭圆发生倾斜/方向(即b ~= 0))

之后,在估计之后,倾斜被从椭圆中移除(使用旋转矩阵),然后,其余描述椭圆的参数从圆锥表示中提取。

出于调试目的,可以在给定的轴句柄上绘制估计。

注意:
1)此功能在三维轴系统上不起作用。(只有2 d)
2)至少需要5个点才能估计出椭圆的5个参数。
3)如果数据是双曲线或抛物线,函数返回空字段和状态指示

引用作为

阿加(2021)。fit_ellipse(//www.tatmou.com/matlabcentral/fileexchange/3215-fit_ellipse), MATLAB中央文件交换。检索

意见及评分(103

Wenfang张

钱徐

GEUNGYU宋

亨利

马蒂亚斯

从原则上讲,这个函数运行得很好。正如其他人指出的,返回的角度有点不一致。将角度分配给椭圆的两个轴中的一个会更有意义,并从0到180度计数,所以角度是明确的。另外,我不确定返回的a和b的值应该表示什么。举例说明会很有帮助。

库马尔

axis_handle是什么?在这种格式中,我们必须给出axis_handle

宏宇赵

Mengqi李

端午Roelvink

伟大的功能!工作性能好,速度快,有非常实际的输出。谢谢!

olimpia_m

赵裴

严厉的耆那教徒的

奥斯卡锤

工作很好,
我创建了另一个输出
= (1/2 * atan2(b,(c-a)))*180/pi;不是弧度,而是度
它对我的数据有效

孤独的Ishfaq

你好,有人能帮我吗?我可不想在行刑后看到阴谋。
也没有得到任何错误

赛MANOJ KONDAPALLI

你好。有人能帮我解决以下错误,我运行上述上传的代码@Ohad Gal
错误使用。/
矩阵维数必须一致。

uFit_ellipse错误(第157行)
= numer. /分母项;

卢卡斯lenne

熊张

谁能帮忙加一条线来画出合适的椭圆?

沙古普塔

你好,这个很合身。谢谢你。

我有一个关于椭圆倾斜的问题。如果我没有错,椭圆的倾斜是顺时针方向从负x轴。

有人用过这些与利萨约斯曲线相关的拟合吗?

阿里温迪亚

很好的例子。

Narrendar RaviChandran

凡灵非政府组织

Luuk

非常有用的功能。对于如何修改脚本以便找到加权最小二乘解,您有什么见解吗?目前,如果输入数据包含一个离群值(由于某种原因,在MATLAB中没有检测到离群值),拟合椭圆会受到很大影响。看这个例子:https://imgur.com/a/nwQPXp0

有什么建议吗?

编辑:添加示例

珍妮Stransky

非常好的功能,谢谢!这些评论也很好地理解了它是如何工作的!
也感谢Frank对角度问题的修复。
在我看来,有两件事需要注意:
- atan产生的不确定性(双角是以pi为模计算的,所以角度方向_rad是以/2为模计算的)->这是通过使用atan2来解决的,Frank建议如下
事实上,在你的计算中你使用旋转矩阵R = [cos sin];就我所知,通常旋转定义为R = [cos -sin];sin(φ)cos(φ)]。如果你想用自己的函数来绘制椭圆,这是需要考虑的;否则,你确实需要使用=作为倾斜角。
非常感谢这个非常有用的代码!!

Milad摩

saifalden altaie

嗨,感谢这段代码!但是我如何在matlab中绘制椭圆和它的拟合呢?因为我只得到输出数据而没有绘图

BlueEyes

示例执行_without_ 'mysterious'参数(axis_handle),注释提到的行244,262,263:
----------------
x =[0; 2、6、10、12、8;4);
y =(2、6、10、10;4 0;2);
fit_ellipse (x, y)
----------------
椭圆很合适。作者,请详细说明。谢谢

Wojciech Matwij

雅格布

嗨,非常漂亮的代码!我如何绘制椭圆和它适合在matlab??请帮助我!

撒母耳Lazerson

如果代码输出一些参数中的错误度量,那就更好了。

希瑟·摩根

我不明白axis_handle要做什么才能绘制椭圆

Min-Jong公园

我不知道X0 Y0和X在Y中的中心点是什么。在我的任务中,这两点是非常不同的。请让我知道…

弗雷德里克Moisy

杰西卡·西斯柯克

请注意;angleFromX的内部计算似乎偏离了90度(错误的象限)。很棒的脚本,非常有用。

sangeetha sugumar

优秀的matlab脚本拟合椭圆到不规则形状的数据....如果代码可以扩展到为分散的数据绘制多个椭圆,那就太好了。

sangeetha sugumar

优秀的matlab脚本拟合椭圆到不规则形状的数据....如果代码可以扩展到为分散的数据绘制多个椭圆,那就太好了。

Ganeshkumar米

你好,谢谢你的代码,它工作得很好!我想求出两个椭圆的交点面积。是否有我可以确定与此脚本的扩展?谢谢你!

plasmageek

我使用了一个不同的椭圆拟合代码,它被一个更复杂的数据集缠住了。这一个工作很好,不是内存密集型。

埃塞俄比亚可以

伟大的提交!有一个小问题,当使用多个轴并试图绘制它们时-设置plot命令的方式将会绘制到活动轴。无论如何,当用户将axis_handle传递给函数时,显式地绘制到该轴将非常有用。

Abhinna behera

好景

它是拟合椭圆的,而不是最小二乘法。我很想知道你计算ab c d e f的方法的原理。

有任何文件吗?

或者近红外光谱

很有效,但是有论文支持这些方程吗?
谢谢!

rcjr15

我得到以下错误:
在fit_ellipse中,155
我给出x=[191 192 193 194 195]'
y=[56 57 58 59 60]

Setoshi C

关于方向问题,用angle_to_x =代替。

Rholais Lii

WARNING(")不重置警告状态。使用LASTWARN(”)。

弗兰克

还有一个细节,使用atan2()修复,必须删除对orientation_tolerance的检查。

里卡多·克鲁兹

我认为代码注释上有一个错误(不是代码本身):
< A' X'*X*A + 2*f_c' X*A + N*f^2
A' X' X' A - 2*f_c' X' A + N*f^2
(成本函数中该因子的符号不应该是负的吗?)

顺便说一下,如果椭圆拟合结构具有MSE误差(这样我们就知道它的拟合有多好),那就太酷了:
N =长度(x);
MSE = (* X ' * X *“2 * (X和*的)+ N) / N;

弗兰克

很棒的功能,但我也有和Rob(下图)一样的阶段问题。修复是在第170行,从:

Orientation_rad = 1/2 * atan(b/(c-a));

:

= 1/2 * atan2(b, (c-a));

所以返回值覆盖+/- 90度而不是+/- 45度

罗伯•巴顿

%添加我的代码来获得长轴的真实旋转角度
%构成二次矩阵
Q = [a b/2;b / 2 c];

对其执行特征分解
[eigVec, eigValue] = eig(Q);

计算到长轴的角度
angleToX = atand (abs (eigVec (2,1)) / abs (eigVec (1,1)));

从90-180得到角度的%检查符号
%因为向量可以指向其他方向,所以必须检查所有4象限
if (sign(eigVec(1,1)) == -1) = 1
%长轴指向左边
if (sign(eigVec(2,1)) == 1)
上升百分之几,离开前0-90象限
angleFromX = angleToX;
其他的
%分下降,所以将其视为椭圆与长
%轴在90-180范围内,因为轴可以指向任何方向。
angleFromX = 90 + (90 - angletox);
结束
其他的
%长轴向右
if (sign(eigVec(2,1)) == 1)
%长轴向上
angleFromX = 90 + (90 - angletox);
其他的
长轴指向下降
angleFromX = angleToX;
结束
结束

这里是我建议的最后一个添加,以获得真实的角度(angleFromX)(完整的360度)

然后添加:

angleToX, angleToX,……
angleFromX, angleFromX,……

到输出结构。

我在你打电话给

从二次曲线方程中提取参数
[a,b,c,d,e] = deal(a(1),a(2),a(3),a(4),a(5));

但是你可以组织它是最好的。

罗伯•巴顿

在阅读了你写得很好的评论和一些网络搜索之后,我发现你在做什么,并建议也许添加以下内容。

也许在返回结构中添加另一个成员,比如'angleToX',然后在你的orientation_rad之后添加一些代码来计算从长轴到X轴的角度或旋转:

Q = [a b/2;b / 2 c];
[eigVec, eigValue] = eig(Q);
angleToX = atand (abs (eigVec (2, 1) / abs (eigVec (1,1)));

Q只是把Ax^2+Bxy+Cy^2变成二次形式,特征分解向量是椭圆的两个轴。通过计算切线,我们有效地计算了从长轴到x轴的角度,这样我们就知道了椭圆相对于x轴旋转了多少。通过这种方式,您将得到大于45度的值。

你计算的是为了找出如何使b元素归零。

如果你添加了这个,那么你可以使用“绘制椭圆”功能来绘制你刚刚适合的椭圆,它将知道旋转它的多少来覆盖你刚刚适合的分散点。

非常感谢,非常棒的代码。

罗伯•巴顿

我想用这个函数来拟合所有角度的椭圆。你能解释一下如何计算方向吗?在45度之后,它并没有像我预期的那样工作。

看看你的代码,我可以看到你在使用切线…

你能解释一下吗?这个程序可以用于大于45度的省略号吗?

露西

露西

我不能画出椭圆。谁能给我解释一下如何使用这个代码?谢谢

基督教

对于我的任务,这个函数比我迄今为止尝试过的其他函数工作得更好。非常感谢Ohad!!

@Aritra:要在二进制映像上运行这个函数,你必须运行:
[X Y] = ind2sub(size(img),find(img));
E = fit_ellipse (x, y);

然后你可以做:
如果E.long_axis > 0
[X, Y] = calcEllipse(E, 360);
结束

把它画成椭圆:
情节(Y、X);

函数calcEllipse:
function [X,Y] = calcEllipse(varargin)
% function [X,Y] = calculateEllipse(X,Y, a, b,角度,步骤)
%#该函数返回绘制椭圆的点
% #
@param x x坐标
%# @param y y坐标
%# @param半长轴
%# @param b半子轴
%# @param angle椭圆的角度(单位:rad)
% #
%来源:http://stackoverflow.com/questions/2153768/draw-ellipse-and-ellipsoid-in-matlab/24531259#24531259
%由Christian Fässler修改

步骤= 360;

If nargin == 1 || nargin == 2
x =变长度输入宗量{1}.X0_in;
y =变长度输入宗量{1}.Y0_in;
一个=变长度输入宗量{1}。;
b =变长度输入宗量{1}。b;
角=变长度输入宗量{1}.phi;
如果nargin == 2
步骤=变长度输入宗量{2};
结束
Else if nargin == 5 || nargin == 6
x =变长度输入宗量{1};
y =变长度输入宗量{2};
一个=变长度输入宗量{3};
b =变长度输入宗量{4};
角=变长度输入宗量{5};
如果nargin == 6
步骤=变长度输入宗量{6};
结束
其他的
错误(错误的输入);
结束
结束

β=角;
sinbeta =罪(β);
cosbeta = cos(β);

Alpha = linspace(0,2 *pi, steps)';
sinalpha =罪(α);
cosalpha = cos(α);

X = round(X + (a * cosalpha * cobeta - b * sinalpha * sinbeta));
Y = round(Y + (a * cosalpha * sinbeta + b * sin * cosbeta));

if nargout==1, X = [X Y];结束
结束

Aritra Das

有谁能提供一个关于如何在实践中实现这一点的清晰想法吗?
例如,如果我想在二进制图像中找到椭圆,比如bw,如何在图像上运行这段代码来获得椭圆?
正如我所看到的,没有办法提供矩阵名作为输入参数。
如果有人能解释输入参数"输入:x,y -两个列向量中的点的集合。至少需要5分!”
我的意思是,这个声明稍微详细一点会很有帮助。

马塞洛

很棒的代码,非常有用!
然而,我发现了一个与椭圆方向有关的错误,我读到有些人也有同样的问题。作者写道,“为了纠正这一点,定向公差的测试应该标准化”。
我该如何解决这个问题?有人能帮我吗?我会非常感激的。
感谢优势,抱歉我的英语

丁鼎

非常感谢!很好的工作!帮我这么大的忙!

Shuqing

非常感谢!很有帮助。

阿米尔

路易吉Sanguigno

多谢! !

玛蒂娜·卡拉汉

杰夫•安德森

伟大的代码!伟大的工作…我得花点时间看看。对于我的问题,我需要迫使原点在(0,0)和正交轴上。

杰夫•安德森

已经Viswan

我无法绘制输出结果。我哪里出错了?
%%
h =情节(ydata zdata);
ellipse_t = fit_ellipse (ydata zdata, h)

吉拉德Kapel

Amit革命联合阵线

很好的代码,但是,你可能有一个与椭圆方向相关的错误,参见:

//www.tatmou.com/matlabcentral/fileexchange/22423

我固定它,并添加了一个计算剩余的配合,这提供了一个质量衡量的配合。
如果你想要我的版本,请邮寄到:
amitruf@gmail.com

保罗

如何使用这个?我的意思是,输入x和y?我能举个例子吗?谢谢!这对我的项目非常有用!

大卫Scaduto

史蒂文Dakin

在盒子外面工作。非常有用的。谢谢。

哈桑Naseri

出色的部署,易于使用和良好的评论…谢谢

穆罕默德El-Said

伟大的工作,
感谢分享……

Tima事项

谢谢你!这对我的工作很有帮助

Thanos

嗨,我正在使用脚本,它对我的数据工作得很好。我试着做一些数学计算,有一点我很纠结。为什么假设f=-1?就我从代码中看到的,我们给f赋值会影响a, b, c, d, e,从而影响椭圆属性。这在数学上是微不足道的吗?我期待着你的答案
干杯
Thanos

熊老虎

Rafal

你好。有人能帮助我和给出在这个matlab代码中使用的算法的描述。也许是出版物的链接。如果有人也有这个算法的块方案,请发给我。我的邮件:
Monter70@gmail.com

致以最亲切的问候

Rafal

你好,我使用这个脚本,它工作完美,但不幸的是,我有一个问题…

我加载信号,它画一个椭圆,当我想把椭圆附近的点,有一个近似他们被移动。我认为它与椭圆的新坐标有关。因为我使用CMD plot(x,y,'b');这是椭圆的理想弓,但它移动了。有人能帮帮我吗?

拉克什

非常感谢! !不错的工作!

罗伊

谢谢你的分享。

Rafal

你好。我得到了所有的椭圆参数。我加载两个正交信号a x=b1ch3(:,1), y=b1ch4(:,1),有问题,因为它没有绘制和拟合到这一点的椭圆。

史卡拉孟加

我在一个循环中使用你的函数,有没有可能在循环的每个迭代中画出不同颜色的椭圆?

穆斯塔法

Evgeny公关

Sieun

谢谢你:D

Raymond Cheng

谢谢楼主分享!

苏菲

我发现. .这只是一个角度的问题:
T = - ellipse_t.phi;

苏菲

你的问题解决了吗?
我不知道你到底有什么问题,但也许你想要的是:
处理=情节(221);%之类的
ellipse_t = fit_ellipse (x, y,处理);%这个椭圆应该画在子图上,否则你的椭圆超出了范围,如果我没有错的话

苏菲

非常感谢这个脚本,它真的很有用!
我有一个问题,因为我陷入了麻烦:我想得到所有的像素是在椭圆..我在做类似的事情,但它不工作:

x0 = ellipse_t.X0_in;
y0 = ellipse_t.Y0_in;
一个= ellipse_t.a;
b = ellipse_t.b;
t = ellipse_t.phi;
x = 1:尺寸(我,1)
y = 1:尺寸(我,2)
X = (x-x0) * cos (t) + (y-y0) * sin (t);
(Y =) - x-x0 * sin (t) + (y-y0) * cos (t);
如果(X^2/a^2+Y^2/b^2)> 1%外椭圆
我(y、x) = 0;
结束
结束
结束

任何想法?提前谢谢!

撒母耳

嗨,我有一个问题....当运行代码时,程序会显示椭圆结果,但不要用点和椭圆拟合曲线绘制图形(与上面的图形相同)。我想看看拟合曲线,但我不知道问题出在哪里……请人帮助我…(对不起我的英语)

凯文·肖

爱死它了。是广告。

戴夫·皮克

正是我想要的,完美。做它说的,做得又好又容易。

丹尼尔·尼尔森

太棒了!我只需要修改程序来绘制非旋转的椭圆,否则就完美了!

一个年代

罗伊咕噜咕噜叫

谢谢

Raimund莱特纳

令人难以置信的有用和实用的m文件

苏菲Jarlier

有你的代码真好!只是一个问题:我随机选择了5个点并执行你的函数,但我得到了以下错误:
在fit_ellipse中,155
停止是因为一个关于矩阵反转的警告
但我有4个点都有相同的y=320,这是我的图像的最大尺寸。这5个点有5个不同的y和5个不同的x吗?
谢谢你的回答
苏菲

海基Suhonen

对我来说很管用。简单的界面,良好的可选可视化。

威廉·范德默维

太好了。情节功能也有很大的帮助。

吉塔Adur

上乘的! !写得很好,非常容易使用。

Antje _

谢谢!

Eric Tittley

Chaiyanan桑旁

谢谢你!目前,我主要研究的是彩色图像中的人脸检测。

P F

做它声称做的事。很有帮助!

彼得·德拉亨特

感谢Ohad -它与颜色识别数据工作得很好。最好的祝愿,彼得

拉里•奥尼尔

这个方法对我所有的噪声数据都很有效。也写得很好,非常容易使用。

MATLAB版本兼容性
创建R12.1
与任何版本兼容
平台的兼容性
窗户 macOS Linux

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!