Python:在3D数组(图像堆栈)中的邻域中找到最高价值

时间:2019-02-25 10:25:40

标签: python numpy image-processing

我使用模板匹配算法来检测目标图像中给定对象的实例。 该算法会生成如下所示的热图:

enter image description here

到目前为止,我已经使用skimage.feature.peak_local_max在热图中找到了运行良好的局部峰。

现在,我想针对模板的不同旋转运行模板匹配,这将给我几个热图。像这样:

enter image description here

我将这些图像堆叠在一起以创建3D数组,现在我想在本地 neighborhood 中找到最高的值。例如,将邻域定义为高15像素(但包括所有旋转)。

3D数组的形状为(高度,宽度,旋转)。 z轴对应于模板的旋转。

编辑: 我自己找到了一个解决方案(带有 markuscosinus 的有用评论),并将在此发布,以防有​​人遇到相同的问题:

我查看了scipy.ndimage.filters.maximum_filter的实现(可以在here中找到。我微动了一下代码,以适应我的数据形状,并使用了footprint = np.ones((size_neighborhood, size_neighborhood, nr_rotations))

2 个答案:

答案 0 :(得分:1)

实现此目标的一种方法如下:

  1. 使用skimage.feature.peak_local_max
  2. 查找每次旋转的局部最大值
  3. 对于在步骤1中找到的m处的每个最大(x,y,z),请检查附近是否有其他人。最简单的情况是检查带有拐角(x-n,y-n,y-n)(x+n,y+n,y+n)的邻域立方体,其中n是邻域大小。如果附近有一些,只能保持最大。

我知道,这在效率方面不是很令人满意,但是如果您没有太多或太大的图片,则应该完成工作:)

答案 1 :(得分:1)

我自己找到了一个解决方案(带有 markuscosinus 的有用评论),如果有人遇到相同的问题,我会在这里发布:

我查看了scipy.ndimage.filters.maximum_filter的实现(可以在here中找到。我微动了一下代码,以适应我的数据形状,并使用了footprint = np.ones((size_neighborhood, size_neighborhood, nr_rotations))