利用numpy.gradient計算圖像梯度

numpy.gradient(): 計算n維數組的梯度,返回和原始數組同樣大小的結果。

說明

對於1維的數組:兩個邊界的元素直接用後一個減去前一個值,得到梯度,即bab-a;對於中間的元素,取相鄰兩個元素差的一半,即(ca)/2(c-a) / 2
如:

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()

結果
gradient

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章