这个函数使用最小二乘准则估计从给定的点集(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中央文件交换。检索.
从原则上讲,这个函数运行得很好。正如其他人指出的,返回的角度有点不一致。将角度分配给椭圆的两个轴中的一个会更有意义,并从0到180度计数,所以角度是明确的。另外,我不确定返回的a和b的值应该表示什么。举例说明会很有帮助。
axis_handle是什么?在这种格式中,我们必须给出axis_handle
伟大的功能!工作性能好,速度快,有非常实际的输出。谢谢!
工作很好,
我创建了另一个输出
= (1/2 * atan2(b,(c-a)))*180/pi;不是弧度,而是度
它对我的数据有效
你好,有人能帮我吗?我可不想在行刑后看到阴谋。
也没有得到任何错误
你好。有人能帮我解决以下错误,我运行上述上传的代码@Ohad Gal
错误使用。/
矩阵维数必须一致。
uFit_ellipse错误(第157行)
= numer. /分母项;
谁能帮忙加一条线来画出合适的椭圆?
你好,这个很合身。谢谢你。
我有一个关于椭圆倾斜的问题。如果我没有错,椭圆的倾斜是顺时针方向从负x轴。
有人用过这些与利萨约斯曲线相关的拟合吗?
很好的例子。
非常有用的功能。对于如何修改脚本以便找到加权最小二乘解,您有什么见解吗?目前,如果输入数据包含一个离群值(由于某种原因,在MATLAB中没有检测到离群值),拟合椭圆会受到很大影响。看这个例子:https://imgur.com/a/nwQPXp0
有什么建议吗?
编辑:添加示例
非常好的功能,谢谢!这些评论也很好地理解了它是如何工作的!
也感谢Frank对角度问题的修复。
在我看来,有两件事需要注意:
- atan产生的不确定性(双角是以pi为模计算的,所以角度方向_rad是以/2为模计算的)->这是通过使用atan2来解决的,Frank建议如下
事实上,在你的计算中你使用旋转矩阵R = [cos sin];就我所知,通常旋转定义为R = [cos -sin];sin(φ)cos(φ)]。如果你想用自己的函数来绘制椭圆,这是需要考虑的;否则,你确实需要使用=作为倾斜角。
非常感谢这个非常有用的代码!!
嗨,感谢这段代码!但是我如何在matlab中绘制椭圆和它的拟合呢?因为我只得到输出数据而没有绘图
示例执行_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)
----------------
椭圆很合适。作者,请详细说明。谢谢
嗨,非常漂亮的代码!我如何绘制椭圆和它适合在matlab??请帮助我!
如果代码输出一些参数中的错误度量,那就更好了。
我不明白axis_handle要做什么才能绘制椭圆
我不知道X0 Y0和X在Y中的中心点是什么。在我的任务中,这两点是非常不同的。请让我知道…
请注意;angleFromX的内部计算似乎偏离了90度(错误的象限)。很棒的脚本,非常有用。
优秀的matlab脚本拟合椭圆到不规则形状的数据....如果代码可以扩展到为分散的数据绘制多个椭圆,那就太好了。
优秀的matlab脚本拟合椭圆到不规则形状的数据....如果代码可以扩展到为分散的数据绘制多个椭圆,那就太好了。
你好,谢谢你的代码,它工作得很好!我想求出两个椭圆的交点面积。是否有我可以确定与此脚本的扩展?谢谢你!
我使用了一个不同的椭圆拟合代码,它被一个更复杂的数据集缠住了。这一个工作很好,不是内存密集型。
伟大的提交!有一个小问题,当使用多个轴并试图绘制它们时-设置plot命令的方式将会绘制到活动轴。无论如何,当用户将axis_handle传递给函数时,显式地绘制到该轴将非常有用。
它是拟合椭圆的,而不是最小二乘法。我很想知道你计算ab c d e f的方法的原理。
有任何文件吗?
很有效,但是有论文支持这些方程吗?
谢谢!
我得到以下错误:
在fit_ellipse中,155
我给出x=[191 192 193 194 195]'
y=[56 57 58 59 60]
关于方向问题,用angle_to_x =代替。
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];结束
结束
有谁能提供一个关于如何在实践中实现这一点的清晰想法吗?
例如,如果我想在二进制图像中找到椭圆,比如bw,如何在图像上运行这段代码来获得椭圆?
正如我所看到的,没有办法提供矩阵名作为输入参数。
如果有人能解释输入参数"输入:x,y -两个列向量中的点的集合。至少需要5分!”
我的意思是,这个声明稍微详细一点会很有帮助。
很棒的代码,非常有用!
然而,我发现了一个与椭圆方向有关的错误,我读到有些人也有同样的问题。作者写道,“为了纠正这一点,定向公差的测试应该标准化”。
我该如何解决这个问题?有人能帮我吗?我会非常感激的。
感谢优势,抱歉我的英语
非常感谢!很好的工作!帮我这么大的忙!
非常感谢!很有帮助。
多谢! !
伟大的代码!伟大的工作…我得花点时间看看。对于我的问题,我需要迫使原点在(0,0)和正交轴上。
我无法绘制输出结果。我哪里出错了?
%%
h =情节(ydata zdata);
ellipse_t = fit_ellipse (ydata zdata, h)
很好的代码,但是,你可能有一个与椭圆方向相关的错误,参见:
//www.tatmou.com/matlabcentral/fileexchange/22423
我固定它,并添加了一个计算剩余的配合,这提供了一个质量衡量的配合。
如果你想要我的版本,请邮寄到:
amitruf@gmail.com
如何使用这个?我的意思是,输入x和y?我能举个例子吗?谢谢!这对我的项目非常有用!
在盒子外面工作。非常有用的。谢谢。
出色的部署,易于使用和良好的评论…谢谢
伟大的工作,
感谢分享……
谢谢你!这对我的工作很有帮助
嗨,我正在使用脚本,它对我的数据工作得很好。我试着做一些数学计算,有一点我很纠结。为什么假设f=-1?就我从代码中看到的,我们给f赋值会影响a, b, c, d, e,从而影响椭圆属性。这在数学上是微不足道的吗?我期待着你的答案
干杯
Thanos
你好。有人能帮助我和给出在这个matlab代码中使用的算法的描述。也许是出版物的链接。如果有人也有这个算法的块方案,请发给我。我的邮件:
Monter70@gmail.com
致以最亲切的问候
你好,我使用这个脚本,它工作完美,但不幸的是,我有一个问题…
我加载信号,它画一个椭圆,当我想把椭圆附近的点,有一个近似他们被移动。我认为它与椭圆的新坐标有关。因为我使用CMD plot(x,y,'b');这是椭圆的理想弓,但它移动了。有人能帮帮我吗?
非常感谢! !不错的工作!
谢谢你的分享。
你好。我得到了所有的椭圆参数。我加载两个正交信号a x=b1ch3(:,1), y=b1ch4(:,1),有问题,因为它没有绘制和拟合到这一点的椭圆。
我在一个循环中使用你的函数,有没有可能在循环的每个迭代中画出不同颜色的椭圆?
谢谢你:D
谢谢楼主分享!
我发现. .这只是一个角度的问题:
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;
结束
结束
结束
任何想法?提前谢谢!
嗨,我有一个问题....当运行代码时,程序会显示椭圆结果,但不要用点和椭圆拟合曲线绘制图形(与上面的图形相同)。我想看看拟合曲线,但我不知道问题出在哪里……请人帮助我…(对不起我的英语)
爱死它了。是广告。
正是我想要的,完美。做它说的,做得又好又容易。
太棒了!我只需要修改程序来绘制非旋转的椭圆,否则就完美了!
谢谢
令人难以置信的有用和实用的m文件
有你的代码真好!只是一个问题:我随机选择了5个点并执行你的函数,但我得到了以下错误:
在fit_ellipse中,155
停止是因为一个关于矩阵反转的警告
但我有4个点都有相同的y=320,这是我的图像的最大尺寸。这5个点有5个不同的y和5个不同的x吗?
谢谢你的回答
苏菲
对我来说很管用。简单的界面,良好的可选可视化。
太好了。情节功能也有很大的帮助。
上乘的! !写得很好,非常容易使用。
谢谢!
谢谢你!目前,我主要研究的是彩色图像中的人脸检测。
做它声称做的事。很有帮助!
感谢Ohad -它与颜色识别数据工作得很好。最好的祝愿,彼得
这个方法对我所有的噪声数据都很有效。也写得很好,非常容易使用。