opencv - Opencv Mat: 查找所有峰和山谷

  显示原文与译文双语对照的内容

我想知道什么是最好的方法来找到所有的山峰和山谷在一个 2D的灰色水平垫。

我发现只有opencv函数在一个垫子中发现局部极值,但并非所有的峰和山谷。

所以我试图找出自己的算法,但我希望有一种方法可以让它更快

我的想法是:

为了找到所有的峰值:

  • 查找所有值 255的像素,将它的标记为峰值并被发现
  • 找到所有具有值 254的像素,如果没有邻居标记为已经发现的邻居( 并将它的标记为已经发现) 。
  • 在 0之前执行相同操作。

然后从 0开始,从到 255重新做同样的事情。

那么,你觉得如何?

我想有更快速的方法?

谢谢

PS: 为了尝试检测干细胞中的干细胞,我做了这样的操作: sample

因为我认为在干细胞( 中间最重要的事情) 中会有更多的峰和山谷。 但我相信这不是一个很好的方法,因为我看起来在细胞内的峰值比外部多。

时间: 作者:

  1. 如果你想找到所有的局部峰- 这是非常有效的算法: 对于每个像素,如果它是> = 它的8个相邻像素的。 如果是,将它的标记为局部最大值,否则。 你将在图像中得到你的解决方案。
  2. 如果不需要所有的峰值,但是比它的他解决方案还要说 5个最高峰值: 找到最高的峰值并用黑色覆盖它,它的7 x7邻域。 现在重复这些步骤( 查找全局最大值并抑制它) 。 迭代这里过程 5次,你将得到 5个最高峰值,它们之间的距离至少为 7像素之间的距离。 这种算法不是很精确,但是它很简单,很快,在许多情况下是。
  3. 如果上述方法不够好,你可能需要重枪。 你熟悉"形态重建"? 如果没有,请谷歌搜索"洪水填充"算法并阅读它。 它充满了局部的山谷和山峰。 然后阅读了关于形态重建。 虽然它可以解决你的问题,但是如果你不使用 GPU,运行时间可能会很慢。
作者:

一个想法是:

  • 定义只允许一个峰值( PeakArea )的区域,并定义峰值的阈值。
  • 将窗口的大小与图片上的峰值区域滑动。
  • 如果窗口中至少有一个像素超出了阈值: 将这里区域中的最大像素标记为峰值,所有其他像素为 not-a-peak 。

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

作者:
...