我需要一些帮助,我必须制作关于树叶的项目。
我想通过MATLAB实现它。
我的输入是一片叶子的图像(带有白色背景),我需要知道关于叶子的两件事:
1)找到有叶的叶片(每片叶片的像素):
将叶子放在可以检查它的桌子或工作空间上。
查看您要识别的树叶。如果叶子看起来像有手指,这些被认为是叶片。可以有 叶子上的两个到多个叶片的任何地方。
通过观察叶子下面的静脉来区分羽状叶与掌状叶。如果静脉都来自 叶子底部的同一个地方被认为掌状 裂。如果它们是从叶子上的不同位置形成的 中心线,叶子是羽状的叶片。
使用叶词典识别叶子的类型。
2)找到大约叶片的凸起数量:
换句话说,找到每片叶子的“肿胀点”。这些是叶子的例子:
答案 0 :(得分:8)
我在here中找到了一些叶子示例。
这是我尝试解决问题的方法。 在我发现的图像中,背景是完全黑色的。如果你的图像不是这样,你应该使用Otsu的阈值方法。
根据你的形象,我认为只有3种叶子:
这个想法是做blob分析。我使用开放的形态学操作来分离叶子。如果开幕后只有一个blob,我认为它不是复合的。如果叶子不是复合叶子,我会分析斑点的solidity。非坚固意味着它们是有叶的。
以下是一些例子:
function IdentifyLeaf(dirName,fileName)
figure();
im = imread(fullfile(dirName,fileName));
subplot(1,3,1); imshow(im);
% thresh = graythresh( im(:,:,2));
imBw = im(:,:,2) > 0;
subplot(1,3,2);imshow(imBw);
radiusOfStrel = round( size(im,1)/20 ) ;
imBwOpened = imopen(imBw,strel('disk',radiusOfStrel));
subplot(1,3,3);imshow(imBwOpened);
rpOpened = regionprops(imBwOpened,'Area');
if numel(rpOpened)>1
title('Pinnately Compound');
else
rp = regionprops(imBw,'Area','Solidity');
%Leave only largest blob
area = [rp.Area];
[~,maxIndex] = max(area);
rp = rp(maxIndex);
if rp.Solidity < 0.9
title('Pinnately Lobed');
else
title('Pinnately Veined');
end
end
end
答案 1 :(得分:2)
我会通过使用“墙上的右手”算法在向量中扫描叶子的周长,将其从2d转换为1d来解决这个问题。
根据该数据,我认为,人们可以找到主导对称轴(例如拟合线);周长的距离将从该轴计算,然后可以简单地使用阈值+过滤来找到局部最大值和最小值以显示叶片/手指的数量......距离的直方图可以区分羽状叶片和羽状复叶
检查周长曲率的另一个指标(来自两个极值点)将为http://en.wikipedia.org/wiki/Sinuosity
不幸的是,识别静脉是一个完全不同的主题。