检测图像中重叠的椭圆区域(MATLAB)

时间:2013-12-17 17:51:05

标签: matlab image-processing overlap

我在一个二进制图像中有多个植物。假设每片叶子大致呈椭圆形,我如何识别图像中的每片叶子? 示例输入:http://i.imgur.com/BwhLVmd.png

我认为一个好的起点是找到每片叶子的尖端,然后获得每株植物的中心。然后我可以从尖端开始然后到达中心来拟合曲线。我一直在网上看到一些涉及分水岭方法的东西,但我不知道从哪里开始这个想法。

3 个答案:

答案 0 :(得分:3)

你应该意识到这些事情很难有效地工作 - 总会有失败的情况。

这就是说,我认为你的想法并不坏。

您可以按照以下步骤开始:

  1. 识别每株植物的边界曲线(即邻域中有前景和背景的像素)。

  2. 计算每株植物的质心。

  3. 将每个植物边界转换为polar coordinate system,以质心为原点。这相当于设置一个坐标系,其中Y轴上每个边界曲线点的距离和X轴上的角度。

  4. 在边界曲线的这种表示中,尝试识别最大值;这些是叶子的提示。您可能需要进行一些平滑处理。在开始拟合椭圆或其他形状的最大值之前和之后使用曲线的部分。

  5. 通常,极坐标系统总是用于分析大致圆形的东西。

    为了适合你的省略号,一旦你有一个粗略的初始位置,我可能会尝试EM-style方法。

答案 1 :(得分:2)

我会做这样的事情(I是你的二进制图像)

I=bwmorph(bwmorph(I, 'bridge'), 'clean');

SK=bwmorph(I, 'skel', Inf);
endpts = bwmorph(SK,'endpoints');
props=regionprops(I, 'All');

然后将props.centroid中列出的质心中的每个片段连接到应该给你叶子(花瓣?)的endpts元素。

可能需要进行一些过滤,bwmorph是您的朋友。玩得开心!

答案 2 :(得分:0)

正如我们在上一篇文章中所讨论的,我将在一个工厂中提取叶子:

ii=regionprops(I1,'all');  % I1 is the image with only one plant extracted
 center = ii.Centroid;  
 pid=ii.PixelList;
 mm=sum(bsxfun(@minus,pid,center).^2,2);
 [a,b]=sort(mm);
 for n=1:1000  % the larger this number is, the more separated among the leafs, which is good for you to use bwlabel for further processing
     I1(pid(b(n),2),pid(b(n),1))=0;
 end
 imshow(I1)

enter image description here