【问题标题】:Obtaining the best ellipse fit of an irregular shape获得不规则形状的最佳椭圆拟合
【发布时间】:2014-10-03 13:28:21
【问题描述】:

假设我们有一个不规则的形状。我们如何才能获得这种形状的最佳ellipse 拟合? regionprops 可以为此工作吗?如果是这样,你能指导我吗?

谢谢。

【问题讨论】:

  • 请您添加这些省略号的示例。
  • 如果你想使用 regionprops,这些参数可能是要走的路: Centroid , MajorAxisLength , MinorAxisLength , Orientation

标签: matlab shape ellipse


【解决方案1】:

好的,这里有一些代码可以帮助您入门。这绝不是完美的,但这样做很有趣,我希望它会对你有所帮助。代码中最重要的部分实际上是由@Amro 在这个很棒的答案中编写的:check me!。我合并了 Amro 的代码来绘制椭圆(感谢 Amro!)。

正如我在评论中提到的,您可以使用带有几个参数的 regionprops 来估计适合某种形状的椭圆。这些名称是不言自明的,可用于描述椭圆。这是我的假人形状,看起来像一个土豆:

我们将在regionprops 中使用的参数是:

  • 'Centroid'
  • 'MajorAxisLength'
  • 'MinorAxisLength'
  • 'Orientation'
  • 'PixelList'

像素列表用于绘制图像的原始形状。快速而肮脏的方式来查看合身程度。

代码如下:

1) 读取图像,将其转换为黑白(即二进制)并应用 regionprops:

clear all
clc

A = im2bw(imread('DummyEllipse.jpg'));

s = regionprops(A,'Centroid','MajorAxisLength','MinorAxisLength','Orientation','PixelList')

2) 从s结构中恢复参数。请注意,我从结构中访问第二个元素,因为第一个元素对应于绘图区域的边缘(我不知道如何称呼它抱歉)。:

PixList = s(2).PixelList;

x = s(2).Centroid(1);
y = s(2).Centroid(2);
a = s(2).MajorAxisLength/2;
b = s(2).MinorAxisLength/2;
angle = s(2).Orientation;
steps = 50;

3) 将这些参数提供给 Amro 代码以计算椭圆:

%#  @param x     X coordinate
%#  @param y     Y coordinate
%#  @param a     Semimajor axis
%#  @param b     Semiminor axis
%#  @param angle Angle of the ellipse (in degrees)

beta = angle * (pi / 180);
sinbeta = sin(beta);
cosbeta = cos(beta);

alpha = linspace(0, 360, steps)' .* (pi / 180);
sinalpha = sin(alpha);
cosalpha = cos(alpha);

X = x + (a * cosalpha * cosbeta - b * sinalpha * sinbeta);
Y = y + (a * cosalpha * sinbeta + b * sinalpha * cosbeta);

4) 绘制结果:

figure

plot(PixList(:,1),rot90(PixList(:,2),2),'-r') % flip the y coordinates because indexing in Matlab starts form the top of the image.
hold on
plot(X,Y,'k','LineWidth',2)

hold off

这给了我这个:

所以它并不完美,但希望它能帮助您入门。

【讨论】:

  • 非常感谢您的详细回答。我刚刚收到这条线的错误:PixList = s(2).PixelList;,提到:Index exceeds matrix dimensions.。这是为什么?谢谢
  • 哦,在那种情况下,您想使用 s(1).PixelList 和 s(1).Centroid (等等)而不是我上面写的 s(2)。在我的例子中,regionprops 输出 2 个“区域”,包括位置 1 中图形的实际边界,所以我使用 2 作为索引。如果您收到该错误,则可能不考虑图形边界,并且结构 s 的大小是 1 而不是 2 ,就像我的情况一样。我会检查一下,看看是怎么回事,但这应该可以解决你的问题。
  • 所以@productive 对你有帮助吗?
  • 感谢@Benoit_11 的支持。我现在遇到的问题是“数字”出现空白屏幕。另外,我想提一下,我希望这样的椭圆显示在同一张图像上,而不是作为单独的图。
猜你喜欢
  • 2014-01-02
  • 2021-10-20
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多