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()
結果: