获得不规则形状的最佳椭圆拟合

时间:2014-10-03 13:28:22

标签: matlab shape ellipse

说我们的形状不规则。我们怎样才能获得这种形状的最佳ellipse拟合? regionprops是否有效?如果是的话,你能指导我吗?

感谢。

1 个答案:

答案 0 :(得分:2)

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

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

enter image description here

我们将在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

给了我这个:

enter image description here

所以它并不完美,但希望它会帮助你开始。