识别叶片的叶片和凸起

时间:2012-10-06 11:44:54

标签: matlab image-processing computer-vision object-recognition

我需要一些帮助,我必须制作关于树叶的项目。

我想通过MATLAB实现它。

我的输入是一片叶子的图像(带有白色背景),我需要知道关于叶子的两件事:

1)找到有叶的叶片(每片叶片的像素):

  • 将叶子放在可以检查它的桌子或工作空间上。

  • 查看您要识别的树叶。如果叶子看起来像有手指,这些被认为是叶片。可以有 叶子上的两个到多个叶片的任何地方。

  • 通过观察叶子下面的静脉来区分羽状叶与掌状叶。如果静脉都来自 叶子底部的同一个地方被认为掌状 裂。如果它们是从叶子上的不同位置形成的 中心线,叶子是羽状的叶片。

  • 使用叶词典识别叶子的类型。

enter image description here

2)找到大约叶片的凸起数量:

换句话说,找到每片叶子的“肿胀点”。 enter image description here

这些是叶子的例子:

enter image description here enter image description here enter image description here

2 个答案:

答案 0 :(得分:8)

我在here中找到了一些叶子示例。

这是我尝试解决问题的方法。 在我发现的图像中,背景是完全黑色的。如果你的图像不是这样,你应该使用Otsu的阈值方法。

根据你的形象,我认为只有3种叶子: enter image description here

这个想法是做blob分析。我使用开放的形态学操作来分离叶子。如果开幕后只有一个blob,我认为它不是复合的。如果叶子不是复合叶子,我会分析斑点的solidity。非坚固意味着它们是有叶的。

以下是一些例子:

enter image description here enter image description here enter image description here enter image description here

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

不幸的是,识别静脉是一个完全不同的主题。