说我们的形状不规则。我们怎样才能获得这种形状的最佳ellipse
拟合? regionprops
是否有效?如果是的话,你能指导我吗?
感谢。
答案 0 :(得分:2)
好的,这里有一些代码可以帮助您入门。这绝不是完美的,但做起来很有趣,我希望它会对你有所帮助。代码中最重要的部分实际上是由@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
给了我这个:
所以它并不完美,但希望它会帮助你开始。