Numpy 使用arctan2的渐变方向会导致角度翻转
我想使用Numpy 使用arctan2的渐变方向会导致角度翻转,numpy,opencv,matplotlib,computer-vision,Numpy,Opencv,Matplotlib,Computer Vision,我想使用plt.quiver以正确的角度显示阵列渐变的箭头 import numpy as np import matplotlib.pyplot as plt test_array = np.array([[ 0., 0., 0., 0., 0.], [ 0., 64., 128., 64., 0.], [ 0., 127., 255., 12
plt.quiver
以正确的角度显示阵列渐变的箭头
import numpy as np
import matplotlib.pyplot as plt
test_array = np.array([[ 0., 0., 0., 0., 0.],
[ 0., 64., 128., 64., 0.],
[ 0., 127., 255., 127., 0.],
[ 0., 64., 127., 64., 0.],
[ 0., 0., 0., 0., 0.]]).astype(np.float64)
dy,dx = np.gradient(test_array)
theta =np.degrees(np.arctan2(dy,dx))
print(theta)
color = np.sqrt(dy**2 + dx**2)
plt.quiver(dx,dy,color)
plt.show()
但是如果我打印θ:
[[ 0. 90. 90. 90. 0. ]
[ 0. 44.77531182 90. 135.22468818 180. ]
[ 0. 0. -90. 180. 180. ]
[ 0. -45. -90. -135. 180. ]
[ 0. -90. -90. -90. 0. ]]
我可以看到第一行中的角度是[90,90,90]
当我使用quivel
绘制渐变时,我可以看到箭头指向相反的方向
我假设角度是逆时针显示的,但它们是顺时针显示的。我错过了什么?有人能解释一下吗?把数组想象成当用
plt.quiver
绘制时它是上下翻转的。您可以通过在test\u数组中引入一个assymetry来看到这一点。比如说
test_array = np.array([[ 0., 0., 20., 50., 0.],
[ 0., 64., 128., 64., 0.],
[ 0., 127., 255., 127., 0.],
[ 0., 64., 127., 64., 0.],
[ 0., 0., 0., 0., 0.]]).astype(np.float64)
将按如下方式绘制(请注意θ中的角度和绘图底部箭头的角度):
当您查看test\u数组
或theta
时,您可能认为原点位于左上角。但是matplotlib中的原点在左下角。你是什么意思箭头指向相反的方向。您的预期结果是什么?正如我所说,我假设如果角度为90度
,则箭头朝向正y轴(但它朝向负y轴)。如果是180度
,那么我预计箭头将朝向负x轴。如果角度270度
,则我预计箭头将朝向负y轴。逆时针。。。(请注意,我使用quiver函数看到的坐标系)看起来像一个正常的笛卡尔坐标系。您确定dx
和dy
的顺序是由np返回的。gradient
?np。gradient
将计算沿图像给定轴的梯度,因此,axis=0=dy
将是行,axis=1=dx
将是列。所以我不是100%肯定,但这是有道理的。否则,角度是正确的,但箭头与图像的真实强度变化不匹配。根据文档:对于二维数组,返回的将是按轴排序的两个数组。在本例中,第一个数组表示行中的渐变,第二个数组表示列方向的渐变:
可能是另一种方式,但捕捉得很好:)要理解这一点,请比较plt.imshow
和plt.pcolormesh
如何绘制数组。
>>> print(theta)
[[ 0. 81.11934085 76.96664367 125.53767779 180. ]
[ 0. 44.77531182 90. 148.97046189 180. ]
[ 0. 0. -90. 180. 180. ]
[ 0. -45. -90. -135. 180. ]
[ 0. -90. -90. -90. 0. ]]