【问题标题】:Opencv Mat: find all peaks and valleysOpencv Mat:找到所有的峰和谷
【发布时间】:2014-01-16 12:44:42
【问题描述】:

我想知道在 2D 灰度级 Mat 中找到所有峰和谷的最佳方法是什么?

我发现只有 opencv 函数可以找到 Mat 中的局部极值,但不是所有的峰和谷。

所以我试图找出我自己的算法,但我希望有一种方法(已经存在或改进这个)让它更快

我的想法是:

为了找到所有的峰:

  • 找到所有值为 255 的像素,将它们标记为 Peak 和 Discovered
  • 找到所有值为 254 的像素,如果它们没有邻居标记为已发现,则将它们标记为峰值(并将此标记为已发现)
  • 做同样的事情直到 0 点。

然后对从 0 到 255 的山谷重做同样的事情。

那么,你怎么看?

我想有更快的方法吗?

谢谢

PS:我这样做是为了尝试在这样的图像中检测干细胞集落:

因为我认为干细胞集落内部会有更多的峰和谷(中间的大东西)。但恐怕这不是一个很好的方法,因为我的细胞群内的峰似乎比外面的多……

【问题讨论】:

  • 理论上一个好主意,为了让它工作,我会在所有标记为“峰值”或“无峰值”的像素周围定义一个“非峰值”属性以避免以下情况:在完美渐变中255 峰值周围的 254 个像素不会被标记为峰值,但所述 254 周围的所有 253 像素都会被标记。
  • 这就是我使用 Discovered 标记的确切原因。我认为这会避免这种影响,不是吗?
  • 是的,当然,抱歉。由于一个小错误,我误解了您的解释。我现在编辑了你的问题。

标签: opencv image-processing


【解决方案1】:
  1. 如果你想找到所有的局部峰值 - 这里有一个非常有效的算法: 对于每个像素,检查它是否 >= 其 8 个相邻像素中的每一个。如果是,则将其标记为局部最大值,否则不标记。您将通过图像一次获得解决方案。
  2. 如果您不需要所有的峰,而是说 5 个最高峰而不是另一种解决方案:找到最高峰并用黑色覆盖它,以及它的 7x7 邻域。现在重复这些步骤(找到全局最大值并抑制它)。将此过程重复 5 次,您将获得 5 个最高峰,它们之间的距离至少为 7 个像素。该算法不是很准确,但它简单、快速,并且在许多情况下都能胜任。
  3. 如果上述方法不够好,您可能需要一把重型枪。你熟悉“形态重建”吗?如果没有,请谷歌搜索术语“洪水填充”算法并阅读它。它填满了当地的山谷和山峰。之后阅读形态重建。它绝对可以解决您的问题,但如果您不使用 GPU,运行时间可能会很慢。

【讨论】:

    【解决方案2】:

    一个想法是:

    • 定义一个区域,其中只允许一个峰 (PeakArea) 和一个峰的阈值。
    • 在图片上滑动一个具有峰值区域大小的窗口。
    • 如果窗口中至少有一个像素超过阈值:将此区域中的最大像素标记为峰值,将所有其他像素标记为非峰值。

    否则你会发现几乎每个像素都是一个峰值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      • 2013-10-15
      • 2012-09-07
      • 1970-01-01
      • 2019-01-15
      相关资源
      最近更新 更多