Градиентная ориентация с arctan2 приводит к перевернутым углам - PullRequest
1 голос
/ 07 января 2020

Я хочу использовать 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()

Однако, если я печатаю theta:

[[   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] Когда я использую quiver для построения градиента Я вижу, что стрелки указывают в противоположном направлении.

Я бы предположил, что углы отображаются против часовой стрелки, но вместо этого они отображаются по часовой стрелке. Что мне не хватает? Может кто-нибудь объяснить?

1 Ответ

2 голосов
/ 07 января 2020

Думайте о массиве, как будто он перевернут вверх при отображении plt.quiver. Вы можете увидеть это, введя ассиметрию в вашем test_array. Например,

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)

Будет построено следующим образом (обратите внимание на углы в theta и углы стрелок внизу графика):

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

enter image description here

Возможно, когда вы смотрите на test_array или theta, вы думаете, что источник находится в верхнем левом углу. Но источник в matplotlib внизу слева.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...