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

Python:在3D数组(图像堆栈)中查找邻域中的最高值,python,numpy,image-processing,Python,Numpy,Image Processing,我使用模板匹配算法来检测目标图像中给定对象的实例。 该算法生成的热图如下所示: 到目前为止,我已经使用了skimage.feature.peak\u local\u max在热图中找到了工作正常的局部峰值 现在我想为模板的不同旋转运行模板匹配,这将给我几个热图。例如: 我已经将这些图像堆叠在一起,创建了一个3D阵列,现在我想在本地邻域中找到最高值。该邻域例如定义为15像素宽和高(但包括所有旋转) 3D阵列具有形状(高度、宽度、旋转)。z轴对应于模板的旋转 编辑: 我自己已经找到了一个解决方案

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

到目前为止,我已经使用了
skimage.feature.peak\u local\u max
在热图中找到了工作正常的局部峰值

现在我想为模板的不同旋转运行模板匹配,这将给我几个热图。例如:

我已经将这些图像堆叠在一起,创建了一个3D阵列,现在我想在本地邻域中找到最高值。该邻域例如定义为15像素宽和高(但包括所有旋转)

3D阵列具有形状(高度、宽度、旋转)。z轴对应于模板的旋转

编辑: 我自己已经找到了一个解决方案(来自markuscosinus的有用评论),如果有人有同样的问题,我会在这里发布:


我查看了
scipy.ndimage.filters.maximum\u filter
(可以找到。我轻轻地旋转代码以处理我的数据形状,并使用
footprint=np.ones((size\u邻域,size\u邻域,nr\u旋转))
实现这一点的方法如下:

  • 使用
    skimage.feature.peak\u local\u max
  • 对于在步骤1中找到的
    (x,y,z)
    处的每个最大
    m
    ,检查附近是否有其他人。最简单的情况是检查具有角
    (x-n,y-n,y-n)
    (x+n,y+n,y+n)的邻域立方体
    ,其中
    n
    是邻居的大小。如果邻居中有一些,只保留最大的

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

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


    我查看了
    scipy.ndimage.filters.maximum\u filter
    (可以找到它。我轻轻地旋转代码以处理我的数据形状,并使用
    footprint=np.one((大小\u邻域,大小\u邻域,nr\u旋转))

    读取数组,相应地使用
    np.vstack
    np.row\u stack
    并使用
    np.max()
    如果axis=1,此方法将不起作用,因为有关图像顺序的信息已丢失。请参阅我的编辑。谢谢您的回答!我确实已经做了类似的工作,问题是不同旋转的峰值可能相距数像素。在第二步中,您必须在附近搜索,然后将其删除很容易混淆几个点击的峰值。“不同旋转的峰值可以相距几个像素”,这不就是说,在这种情况下有两个局部最大值吗?如果
    (x,y,z)
    z
    旋转中是局部最大值,并且大于
    (x,y,z+1)
    (x,y,z-1)根据定义,它是一个局部最大值。当然
    (x+2,y,z+1)
    可能要大得多,但是
    (x,y,z)
    仍然是一个最大值,所以也许你要寻找的不是所有的局部最大值,而是每个“大峰值”的所有最高值?是的,你是对的。我想“局部最大值”这个词在这里不是最合适的。我的意思是附近的最大值。我将编辑此帖子。