numpy.gradient()
: 计算n维数组的梯度,返回和原始数组同样大小的结果。
说明
对于1维的数组:两个边界的元素直接用后一个减去前一个值,得到梯度,即;对于中间的元素,取相邻两个元素差的一半,即
。
如:
In [2]: f = np.array([1, 2, 4, 7, 11, 16], dtype=np.float)
In [3]: np.gradient(f)
Out[3]: array([1. , 1.5, 2.5, 3.5, 4.5, 5. ])
对于2维数组:分别计算每个维度上的梯度,每个维度上的梯度和上面的1维数组梯度
求法相同。
如:
In [4]: np.gradient(np.array([[1, 2, 6], [3, 4, 5]], dtype=np.float))
Out[4]:
[array([[ 2., 2., -1.],
[ 2., 2., -1.]]), array([[1. , 2.5, 4. ],
[1. , 1. , 1. ]])]
对于高维数组,在上面的基础上继续扩展即可。
应用
对于图像来说,我们使用2维数组比较多,因此这里以求一个灰度图像的梯度为例,说明下numpy.gradient的用法:
9 def norm(x, axis=0):
10 return np.sqrt(np.sum(np.square(x), axis=axis))
11
12
13 if __name__ == '__main__':
14 img = imread('./1.png')
15 img = rgb2gray(img)
16 img = gaussian(img, sigma=3)
17 img = img - np.mean(img)
18
19 img_grad = np.gradient(img)
20 img_grad = norm(img_grad)
21
22
23 fig = plt.figure()
24 ax = fig.add_subplot(1, 2, 1)
25 ax.imshow(img, 'gray')
26
27 ax = fig.add_subplot(122)
28 ax.imshow(img_grad, 'gray')
29
30 plt.show()
结果:

网友评论