Как построить линии на изображении с помощью matplotlib? - PullRequest
0 голосов
/ 07 августа 2020

Я борюсь с проблемой здесь при попытке построить несколько линий на изображении. Итак, это мой код:

fig=plt.figure()
final = cv2.imread('frame9.jpg')
for p in polar:
    plt.plot([0,1],[p[0],p[0]],c='red')
plt.imshow(final,cmap=plt.cm.gray)
plt.show()

My polar ndarray:

[[ 7.28073704e+01 -1.60300574e-02  3.00000000e+00]
 [ 1.68751118e+02 -2.28065027e-02  4.00000000e+00]
 [ 2.10662349e+02 -3.40033470e-02  6.00000000e+00]
 [ 1.20656915e+02 -1.65935831e-02  5.00000000e+00]
 [ 2.28887705e+01 -8.43417664e-04  5.00000000e+00]
 [ 1.27472877e+01 -7.25424861e-03  2.00000000e+00]
 [ 1.09924214e+02 -1.81133209e-02  3.00000000e+00]
 [ 5.85000000e+01  0.00000000e+00  4.00000000e+00]
 [ 1.57589902e+02 -1.70840018e-02  3.00000000e+00]]

Результат показывает только исходное изображение без каких-либо строк. Это из-за полярного ndarray? Или что-нибудь еще? Кто-нибудь может мне помочь, пожалуйста.

Ответы [ 2 ]

2 голосов
/ 07 августа 2020

Поскольку линии по умолчанию рисуются поверх изображений, порядок вызова функции рисования здесь не имеет значения.

Чтобы нарисовать что-либо на изображении, важно знать координаты изображения . С этой целью imshow имеет параметр extent= с ограничениями по x и y. Точные координаты вашего изображения не ясны из вопроса, поэтому я использовал некоторые произвольные значения для примера.

imshow заставляет соотношение сторон быть равным экстентам. Таким образом, фотографии и карты не деформируются. Но для расчетных значений такое фиксированное соотношение сторон часто не требуется. Вы можете изменить его с помощью aspect='auto'.

Также обратите внимание, что изображения по умолчанию отображаются с началом координат вверху, так как это стандартно для большинства форматов изображений. Иногда для рисования сверху может потребоваться, чтобы начало координат было внизу (origin='lower' vs origin='upper'.

from matplotlib import pyplot as plt
import numpy as np

polar = np.array([[7.28073704e+01, -1.60300574e-02, 3.00000000e+00],
                  [1.68751118e+02, -2.28065027e-02, 4.00000000e+00],
                  [2.10662349e+02, -3.40033470e-02, 6.00000000e+00],
                  [1.20656915e+02, -1.65935831e-02, 5.00000000e+00],
                  [2.28887705e+01, -8.43417664e-04, 5.00000000e+00],
                  [1.27472877e+01, -7.25424861e-03, 2.00000000e+00],
                  [1.09924214e+02, -1.81133209e-02, 3.00000000e+00],
                  [5.85000000e+01, 0.00000000e+00, 4.00000000e+00],
                  [1.57589902e+02, -1.70840018e-02, 3.00000000e+00]])
fig, ax = plt.subplots()
final = 10-np.random.rand(500,500).cumsum(axis=0).cumsum(axis=1)
# final = cv2.imread('frame9.jpg')
plt.imshow(final, cmap=plt.cm.gray, extent=[0, 10, 0,  polar[:,0].max()], aspect='auto', origin='lower')
for p in polar:
    plt.plot([0, 1], [p[0], p[0]], c='red')
plt.show()

пример сюжета

1 голос
/ 07 августа 2020

проблема в том, что вы сначала рисуете линии, а затем показываете изображение, поэтому изображение перезаписывает нарисованные линии.

Простое изменение порядка, как показано ниже, должно работать:

fig=plt.figure()
final = cv2.imread('frame9.jpg')
plt.imshow(final,cmap=plt.cm.gray)
for p in polar:
    plt.plot([0,1],[p[0],p[0]],c='red')
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...