复习图像梯度,发现Numpy
有一个梯度计算函数,解析它的源码和需要注意的问题,最后自定义一个梯度函数
Numpy
提供了数组梯度计算函数
gradient(f, *varargs, **kwargs)
输入
必选参数:类N维数组(列表/元组/数组)
可选参数:标量列表或数组列表,用于计算差分时的间隔空间
单个标量:为所有轴指定间隔
N个标量:为每一轴指定了间隔,比如dx, dx, dz...
N个数组:为f的每一轴都指定了采样值的下标,每个数组的长度必须匹配相对应那一维的长度
N个标量或数组的组合,其作用等同于2和3
注意:如果关键字参数axis被指定,那么这个可选参数的长度必须和要计算的轴数一致
关键字参数有2个:
edge_order:在边界使用第N-阶差分公式,默认是1-阶
axis:None或者是整数又或者是整数的元组,表示沿着指定的轴计算梯度,默认为None,表示计算所有轴的梯度。如果输入为负数,表示从后向前计算轴的梯度
从它的介绍中,我唯一没理解的就是可选参数的用法,看了代码后也没理解,因为它和一阶差分没有关系,所以在后面的内容就忽略对可选参数的解析
输出
如果输入是一维数组,返回同样大小的梯度数组
如果是多维数组,并要求计算多维,那么返回一个列表,包含计算的每一维的梯度,其大小和输入数组一致
计算方式
在它的介绍中,中间元素使用**2阶中心差分**,但是查看源码发现,它默认使用的其实是一阶中心差分,除非输入可选参数的3和4选项,但是代码中的二阶差分公式也没看懂?,应该是使用泰勒级数的近似公式,所以跳过对代码中二阶差分的介绍
两边使用一阶前向或后向差分,也可通过关键字参数edge_order修改计算方式
差分公式
一阶前向差分:

一阶后向差分:

一阶中心差分:

二阶中心差分:





源码分析见:
https://blog.youkuaiyun.com/u012005313/article/details/84035371blog.youkuaiyun.com