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
(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)
仍然是一个最大值,所以也许你要寻找的不是所有的局部最大值,而是每个“大峰值”的所有最高值?是的,你是对的。我想“局部最大值”这个词在这里不是最合适的。我的意思是附近的最大值。我将编辑此帖子。