7

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

我想用 MATLAB 制作它。

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

1)找到裂叶(每个裂叶的像素):

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

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

  • 通过观察叶子下面的静脉来区分羽状叶和掌状叶。如果叶脉都来自叶基部的同一位置,则认为它是掌状裂片的。如果它们从一条中心线在叶子上的不同位置形成,则叶子呈羽状裂。

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

在此处输入图像描述

2)找到大约叶子的颠簸数量:

换句话说,找到每片叶子的“肿胀点”。 在此处输入图像描述

这些是叶子的例子:

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

4

2 回答 2

8

我在这里找到了一些叶子的例子。

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

根据您的图像,我假设只能有 3 种类型的叶子: 在此处输入图像描述

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

这里有些例子:

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

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
于 2012-10-06T12:54:36.307 回答
3

我将通过使用“右手在墙上”算法在矢量中扫描叶子的周长,将其从 2d 转换为 1d 来解决这个问题。

我想,从这些数据中,可以找到一个主要的对称轴(例如拟合一条线);将根据该轴计算周长的距离,然后可以简单地使用阈值+过滤来找到局部最大值和最小值以显示裂片/手指的数量......距离的直方图可以区分羽状裂片和羽状复叶.

检查周长曲率(从两个极端点)的另一个单一指标是http://en.wikipedia.org/wiki/Sinuosity

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

于 2012-10-06T12:47:15.210 回答