【问题标题】:how to find local maxima in image如何在图像中找到局部最大值
【发布时间】:2014-04-08 16:59:57
【问题描述】:

问题是关于特征检测的概念。 在找到图像的角后我被卡住了,我想知道如何在计算的角内找到特征点。

假设我的灰度图像具有这样的数据

A = [ 1 1 1 1 1 1 1 1;
      1 3 3 3 1 1 4 1;
      1 3 5 3 1 4 4 4;
      1 3 3 3 1 4 4 4; 
      1 1 1 1 1 4 6 4;
      1 1 1 1 1 4 4 4]

如果我使用

B = imregionalmax(A);

结果会是这样的

B = [ 0 0 0 0 0 0 0 0;
      0 1 1 1 0 0 1 0;
      0 1 1 1 0 1 1 1;
      0 1 1 1 0 1 1 1;
      0 0 0 0 0 1 1 1;
      0 0 0 0 0 1 1 1]

问题是我如何挑选最大局部区域内的最高峰(在示例中,我是如何从 3 中选择 5 和从 4 中选择 6)?

我的想法是使用 B 检测每个区域并再次使用 imregionalmax(),但我不擅长编码,我需要一些建议或其他想法。

【问题讨论】:

    标签: matlab local feature-detection


    【解决方案1】:

    还有其他几种简单的方法可以实现 2D 峰值查找器:ordfilt2imdilate

    ordfilt2

    最直接的方法是使用ordfilt2,它对本地邻域中的值进行排序并选择第n个值。 (The MathWorks example 演示了如何实现最大过滤器。)您还可以使用 ordfilt2 实现 3x3 峰值查找器,方法是,(1)使用 不包括中心像素的 3x3 域,( 2)选择最大(第8个)值和(3)与中心值比较:

    >> mask = ones(3); mask(5) = 0 % 3x3 max
    mask =
         1     1     1
         1     0     1
         1     1     1
    

    此掩码中考虑了 8 个值,因此第 8 个值是最大值。过滤器输出:

    >> B = ordfilt2(A,8,mask)
    B =
         3     3     3     3     3     4     4     4
         3     5     5     5     4     4     4     4
         3     5     3     5     4     4     4     4
         3     5     5     5     4     6     6     6
         3     3     3     3     4     6     4     6
         1     1     1     1     4     6     6     6
    

    诀窍是将其与每个邻域的中心值A 进行比较:

    >> peaks = A > B
    peaks =
         0     0     0     0     0     0     0     0
         0     0     0     0     0     0     0     0
         0     0     1     0     0     0     0     0
         0     0     0     0     0     0     0     0
         0     0     0     0     0     0     1     0
         0     0     0     0     0     0     0     0
    

    imdilate

    图像膨胀通常在二值图像上完成,但灰度图像膨胀只是一个最大过滤器(参见imdilate 文档中的Definitions section)。 ordfilt2 使用的相同技巧在这里适用:定义不包括中心邻域像素的邻域,应用过滤器并与未过滤的图像进行比较:

    B = imdilate(A, mask);
    peaks = A > B;
    

    注意:这些方法只能找到单个像素峰值。如果任何邻居的值相同,则不会是峰值。

    【讨论】:

      【解决方案2】:

      函数imregionalmax 为您提供包含最大值及其 8 个邻居的 8 连通区域(即您所看到的 3x3 区域)。然后,您可以使用具有相同 3x3 结构元素的 morphological operations 将这些区域细化到它们的中心。例如

       B = imregionalmax(A);
       C = imerode(B, ones(3));
      

      或等效

       B = imregionalmax(A);
       D =  bwmorph(B, 'erode');
      

      您也可以使用block-processing 编写自己的最大查找函数:

       fun = @(block) % your code working on 'block' goes here ...
       B = blockproc(A, ones(3), fun)
      

      但这很可能会比内置函数慢。 (我现在没有可用的工具箱,所以无法尝试。)

      也可以看看herehere

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-23
        • 1970-01-01
        • 2017-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-28
        相关资源
        最近更新 更多