数组和矩阵之间的numpy渐变不同

时间:2018-08-07 02:35:18

标签: python numpy gradient

我想获取矩阵梯度,但结果不一致

g = img[0:3, 0:3]
gy, gx = np.gradient(g)
print gy,gx

arr=np.array([[138, 144, 141],[134, 135, 132],[137, 135, 133]])
gy, gx = np.gradient(arr)
print gy,gx

结果不同

数据类型:矩阵

gy = array([[252。,247.,247.],[127.5,123.5,124.],[3.,0.,1.]])

gx = array([[6.,1.5,253.],[1.,127.,253.],[254.,126.,254.]])

数据类型:array

gy = array([[-4。,-9。,-9。],[-0.5,-4.5,-4。],[3.,0.,1.]])

gx = array([[6.,1.5,-3。],[1.,-1。,-3。],[-2。,-2。,-2。]])

1 个答案:

答案 0 :(得分:0)

这实际上不是矩阵与数组的问题(尽管使用matrix是一个坏主意,并且可能导致其他问题)。您的img具有较小的dtype,可能是uint8,并且计算溢出。将其首先转换为浮动:

np.gradient(g.astype(float))

演示:

In [7]: arr=np.array([[138, 144, 141],[134, 135, 132],[137, 135, 133]])
In [8]: arr_uint8 = arr.astype('uint8')
In [9]: gx, gy = np.gradient(arr_uint8)
In [10]: gx
Out[10]: 
array([[ 252. ,  247. ,  247. ],
       [ 127.5,  123.5,  124. ],
       [   3. ,    0. ,    1. ]])
In [11]: arr_float = arr_uint8.astype(float)
In [12]: gx, gy = np.gradient(arr_float)
In [13]: gx
Out[13]: 
array([[-4. , -9. , -9. ],
       [-0.5, -4.5, -4. ],
       [ 3. ,  0. ,  1. ]])