Как прочитать сохраненное изображение и найти его в координатах без искажений? - PullRequest
0 голосов
/ 25 октября 2018

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

# read different shape-files, overlaying them, sjoining them`
...
# plotting results:
fig, ax = plt.subplots(figsize=[10, 10])

ax.set_xlim(left=9686238.14, right=9727068.02)
ax.set_ylim(bottom=7070076.66, top=7152463.12)

# various potting like objects.plot(ax=ax, column = 'NAME', cmap='Pastel2', k=6, legend=False) and many others

plt.axis('equal')           
plt.savefig('back11.png', dpi=300)
plt.close()

Таким образом, я получил такую ​​прекрасную картинку back11.png: enter image description here

Во-вторых, я читаю эту картинку и (в тех же самых словах) хочу видеть абсолютно идентичную одну map11.png:

fig, ax = plt.subplots(figsize=[10, 10])
ax.set_xlim(left=9686238.14, right=9727068.02)
ax.set_ylim(bottom=7070076.66, top=7152463.12)

back = plt.imread('back11.png')
ax.imshow(back, extent=[9686238.14, 9727068.02, 7070076.66, 7152463.12])
plt.axis('equal')
plt.savefig('map11.png', dpi=300)
plt.close()

Но на самом деле я получил кое-что еще (map11.png):enter image description here

Каково происхождение такого странного несоответствия?

1 Ответ

0 голосов
/ 25 октября 2018

Когда matplotlib показывает изображение, используя plt.imshow, оно автоматически добавляет ось и пробел вокруг него (независимо от содержимого изображения).В то время как ваше изображение случайно является еще одним сюжетом, который содержит ось и само пустое пространство.Чтобы решить эту проблему, используйте

plt.subplots_adjust(0, 0, 1, 1)
plt.axis('off')

, который не должен выводить ничего, кроме изображения.

Но с другой стороны, вы должны правильно указать plt.figure(figsize=xxx, dpi=xxx), чтобы получить сохраненное изображение(правильный размер, без интерполяции или повторной выборки).Если вы просто хотите увидеть изображение с помощью python (и вы в jupyter блокноте), вы можете использовать Pillow.Если вы преобразуете изображение в объект PIL.Image, оно само по себе будет отображаться с помощью jupyter REPL.

Если вы не находитесь внутри jupyter, вы также можете напрямую открыть изображение с помощью программы просмотра изображений os.По крайней мере, удобнее, чем matplotlib, отображать «точное» изображение.

Кстати, при отображении изображения те же параметры больше не применяются (поскольку его изображение и все параметры скрыты внутри содержимогоэтого).Поэтому нет необходимости (и это неправильно) писать все эти магические числа.Также, если вы хотите сохранить изображение без белой рамки и оси, используйте код выше перед вызовом plt.savefig

...