我有一个二维数组,我想检测它的所有局部最大数组索引。也就是说,给定一个索引 (i, j),其最大梯度是其 8 个相邻值中任意一个的最大绝对变化:
Index: (i, j)
Neighbors:
(i-1,j+1) (i,j+1) (i+1,j+1)
(i-1,j) [index] (i+1,j)
(i-1,j-1) (i,j-1) (i+1,j-1)
Neighbor angles:
315 0 45
270 [index] 90
225 180 135
MaxGradient(i,j) = Max(|Val(index) - Val(neighbor)|)
如果索引的 MaxGradient 至少与其任何邻居自己的 MaxGradients 一样大,则称该索引为局部最大值。
算法的输出应该是一个二维元组数组,或者一个三维数组,其中对于原始数组中的每个索引,输出数组包含一个值,指示该索引是否局部最大,并且,如果所以,渐变的角度。
我的初始实现只是简单地传递数组两次,一次计算最大梯度(存储在临时数组中),然后传递一次临时数组以确定局部最大索引。每次,我都是通过 for 循环来完成此操作,分别查看每个索引。
在 numpy 中是否有更有效的方法来做到这一点?
最佳答案
考虑这 8 个相对索引:
X1 X2 X3
X4 X X5
X6 X7 X8
您可以计算每个像素 X 的差异D1=Val(X)-Val(X1)
、D2=Val(X)-Val(X2)
、 D3=Val(X)-Val(X3)
,D4=Val(X)-Val(X4)
。您不需要计算其他差异,因为它们是前四个差异的镜像。
要计算差异,您可以用一行和一列零填充图像并减去。
关于python - 在 numpy 数组中找到局部最大梯度值的快速方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8178129/