python - 在 numpy 数组中找到局部最大梯度值的快速方法?

标签 python matrix numpy linear-algebra

我有一个二维数组,我想检测它的所有局部最大数组索引。也就是说,给定一个索引 (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/

相关文章:

javascript - Django:无法从 Javascript 调用 python 函数

python - 类型错误 : unsupported operand type(s) for -: 'tuple' and 'tuple'

c - C 中的矩阵表示

c - 二维字符和数字数组

numpy - 使用两个聚合函数时,Pandas 交叉表重复计数?

python - 将字符串拆分为 2 个字母的段

python - django 1.10 媒体图像不显示

matlab - 在 MATLAB 中绘制 3D 空间中的矩阵,而不使用网格和冲浪类型的绘图

python - 使用 range/arange 函数作为参数索引/切片 2d numpy 数组

python - 确保 groupby 输出类型