我在一个二进制图像中有多个植物。假设每片叶子大致呈椭圆形,我如何识别图像中的每片叶子? 示例输入:http://i.imgur.com/BwhLVmd.png
我认为一个好的起点是找到每片叶子的尖端,然后获得每株植物的中心。然后我可以从尖端开始然后到达中心来拟合曲线。我一直在网上看到一些涉及分水岭方法的东西,但我不知道从哪里开始这个想法。
答案 0 :(得分:3)
你应该意识到这些事情很难有效地工作 - 总会有失败的情况。
这就是说,我认为你的想法并不坏。
您可以按照以下步骤开始:
识别每株植物的边界曲线(即邻域中有前景和背景的像素)。
计算每株植物的质心。
将每个植物边界转换为polar coordinate system,以质心为原点。这相当于设置一个坐标系,其中Y轴上每个边界曲线点的距离和X轴上的角度。
在边界曲线的这种表示中,尝试识别最大值;这些是叶子的提示。您可能需要进行一些平滑处理。在开始拟合椭圆或其他形状的最大值之前和之后使用曲线的部分。
通常,极坐标系统总是用于分析大致圆形的东西。
为了适合你的省略号,一旦你有一个粗略的初始位置,我可能会尝试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)