【发布时间】:2011-11-18 05:23:09
【问题描述】:
我有一个二维数组,我想检测它的所有局部最大数组索引。也就是说,给定一个索引 (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 至少与其邻居的任何 MaxGradient 一样大,则称该索引为局部最大值。
算法的输出应该是一个二维元组数组或一个 3 维数组,其中对于原始数组中的每个索引,输出数组包含一个值,该值指示该索引是否为局部最大值,如果所以,渐变的角度。
我最初的实现只是简单地传递了数组两次,一次是为了计算最大梯度(存储在一个临时数组中),然后一次是临时数组以确定局部最大索引。每次,我都通过 for 循环执行此操作,分别查看每个索引。
在 numpy 中有没有更有效的方法来做到这一点?
【问题讨论】:
-
在这种情况下,梯度是用词不当,不是吗?你真的在计算差异,如果你想要梯度,“对角线”邻居的计算必须不同于“行和列”邻居
-
这是一个很好的观点。我想我可能误解了算法。这是AIMA(第三版)书中边缘检测算法的后半部分。
标签: python matrix numpy linear-algebra