Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Numpy 使用arctan2的渐变方向会导致角度翻转_Numpy_Opencv_Matplotlib_Computer Vision - Fatal编程技术网

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