Возврат значений x, y 2D-графика одним щелчком мыши - PullRequest
0 голосов
/ 02 февраля 2020

Я строю простое изображение и хочу получить значение x, y, где я щелкаю мышью.

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

image = Image.open('points.jpg')

data = np.array(image)

plt.imshow(data)
plt.show()

Image with 4 points

Итак, я могу перемещать мышь к каждой точке, щелкать и в конце получить список с 4 значениями x, y.

1 Ответ

0 голосов
/ 02 февраля 2020

Во-первых, для изображений, на которые нужно нажимать, «png» обычно является более подходящим форматом, чем «jpg». Сжатие, используемое для цветов «jpg», может размыть цвета.

mplcursors - это небольшой пакет, который поддерживает щелчок (или зависание) на графике. Стандарт отображает всплывающую подсказку с координатами. В вашем приложении показ всплывающей подсказки аннотации кажется полезным. Если нет, вы можете подавить это поведение с помощью sel.annotation.set_visible(False) и по-прежнему получать событие с координатами.

Координаты бывают двух видов: x и y с использованием системы координат осей или индекс (i,j) для обозначения пикселя. С помощью параметра imshow extent= вы можете гибко установить желаемые диапазоны (по умолчанию x и y go от 0 до ширины и высоты изображения). x,y в центре каждого пикселя являются целочисленными значениями. Таким образом, вы можете добавить в свой список индексы (i,j) или (x,y).

Код для эксперимента:

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import mplcursors

image = Image.open('points.png')
data = np.array(image)
img = plt.imshow(data)

points = []

cursor = mplcursors.cursor(img, hover=False)
@cursor.connect("add")
def cursor_clicked(sel):
    # sel.annotation.set_visible(False)
    sel.annotation.set_text(
        f'Clicked on\nx: {sel.target[0]:.2f} y: {sel.target[1]:.2f}\nindex: {sel.target.index}')
    points.append(sel.target.index)
    print("Current list of points:", points)

plt.show()
print("Selected points:", points)
...