数组和矩阵之间的numpy梯度不同

numpy gradient different between array and matrix

想求矩阵梯度,结果不一致

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. ]])

数据类型:数组

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. ]])

这实际上不是矩阵与数组的问题(尽管使用 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. ]])