2014-10-03 171 views
0

说我们有不规则的形状。我们如何才能获得最适合这种形状的ellipseregionprops是否适用?如果是这样,你能指导我吗?获取不规则形状的最佳椭圆拟合

谢谢。

+0

请问您可以添加这些省略的例子。 – kkuilla 2014-10-03 13:30:08

+1

如果你想使用regionprops,那么这些参数可能是要走的路:Centroid,MajorAxisLength,MinorAxisLength,定位 – 2014-10-03 13:47:12

回答

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结构恢复参数。请注意,我从结构进入第二个元素,因为第一个1对应于绘图区的边缘(我不知道如何称呼它不好意思):

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

所以它不是完美的,但希望它能帮助你开始。

+0

非常感谢您的详细解答。我刚刚在这行中遇到了一个错误:'PixList = s(2).PixelList;',提及:'索引超出了矩阵的维度。这是为什么?谢谢 – productive 2014-10-03 16:22:20

+0

哦,在这种情况下,你想使用s(1)。像我上面写的PixelList和s(1).Centroid(等)而不是s(2)。在我的情况下,regionprops输出2个“区域”,包括位置1中数字的实际边界,所以我用2作为索引。如果你得到这个错误,图形边界可能不被考虑,并且这个结构的大小是1而不是2,就像我的情况一样。我会检查一下,看看它是如何发生的,但这应该可以解决你的问题。 – 2014-10-03 17:52:00

+0

所以@生产它可以帮助你吗? – 2014-10-06 00:02:21