Как изменить атрибут некоторой оси с изображением в python? - PullRequest
0 голосов
/ 10 января 2020

У меня есть изображение в python. Это карта Калифорнии, и мне нужно поместить некоторую точку на эту карту.

Координаты каждой точки получены из CSV. Но значение каждой координаты в широте / долготе. Итак, мне нужно преобразовать его в размер моей фотографии.

Итак, вот описание моей ситуации:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

# dpi for the saved figure: https://stackoverflow.com/a/34769840/3129414
dpi = 120

img = mpimg.imread("california_map_blank.png")
height, width, bands = img.shape

# Update figure size based on image size
figsize = width / float(dpi), height / float(dpi)

# Create a figure of the right size with one axes that takes up the full figure
figure = plt.figure(figsize=figsize)
axes = figure.add_axes([0, 0, 1, 1])

# Draw the image
axes.imshow(img, interpolation='nearest')

Вот результат:

enter image description here

Сначала мне нужно изменить ось Y. Мне нужно инвертировать его так, чтобы 0 начиналось снизу. Затем мне нужно изменить значение оси, [31,42] для оси Y и [-123, -114] для оси X. Потому что точка, которую я хочу разместить на этой карте, находится в этом диапазоне. Один пример координаты: 41.76440000093729, -124.1998.

Теперь вот мой вопрос. Можно ли этого добиться? Как?

PS: я использую python 3.6, и я уже знаю, как разместить точку на изображении. Мне не нужно сохранять только что показанное изображение.

PPS: Моя конечная цель - преобразовать данные широты и долготы в координаты на изображении, поэтому, если вы знаете какой-либо другой способ сделать это (в Python конечно), пожалуйста, скажите мне.

РЕДАКТИРОВАТЬ: Если я применяю это: axes.set_xlim(-124.5,-114) это даст мне это:

enter image description here

Я хочу иметь ось с этим диапазоном, но со всем изображением.

На самом деле, в конце я не буду отображать ось, я просто поставлю карту с точками, но мне нужно разместить указать точку на карте, поэтому я думаю, что мне нужно go на этом шаге.

EDIT2: я пробовал это: axes.imshow(img[::-1], origin='lower', interpolation='nearest') отлично работает, чтобы повернуть ось, но когда я рисую точку python нарисовать ее там же когда я ось была нормальная.

1 Ответ

1 голос
/ 11 января 2020

Необходимо установить пределы изображения с помощью параметра extent=, равного imshow. Это должны быть довольно точные значения для долготы влево и вправо и для широты снизу и сверху.

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

В зависимости от того, как вы используете программу Python, matplotlib покажет интерактивный график. Вы можете увеличить масштаб до каждого региона, и оси будут адаптироваться. В строке внизу будут показаны позиции x и y. Если они не являются желаемыми, вы можете попытаться изменить экстенты, пока они не совпадут.

import matplotlib.pyplot as plt
import matplotlib.image as mpimg

img = mpimg.imread("california_map_blank.png")  

dpi = 120
height, width, bands = img.shape
# Update figure size based on image size
figsize = width / float(dpi), height / float(dpi)

# Create a figure of the right size with one axes that takes up the full figure
fig, ax = plt.subplots(figsize=figsize)

# find the extent
longitude_top_left = -124.5
longitude_top_right = -113
latitude_bottom_left = 32
latitude_top_left = 42
extent = [longitude_top_left, longitude_top_right, latitude_bottom_left, latitude_top_left]

# Draw the image
ax.imshow(img, interpolation='nearest', extent=extent)

plt.show()

resulting image

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