#python #image #matplotlib
#python #изображение #matplotlib
Вопрос:
У меня есть несколько (27) изображений, представленных в 2D-массивах, которые я просматриваю с помощью imshow (). Мне нужно увеличить масштаб в одном и том же месте на каждом изображении. Я знаю, что могу вручную увеличивать масштаб, но это утомительно и недостаточно точно. Есть ли способ программно указать определенный раздел изображения для отображения вместо всего объекта?
Ответ №1:
Вы могли бы использовать plt.xlim
и plt.ylim
, чтобы задать область для отображения:
import matplotlib.pyplot as plt
import numpy as np
data=np.arange(9).reshape((3,3))
plt.imshow(data)
plt.xlim(0.5, 1.5)
plt.ylim(0.5,1.5)
plt.show()
Комментарии:
1. Спасибо! Я понял, что я также могу обрезать предварительный просмотр массива, но ваш метод сохраняет остальную часть массива.
2. В отличном введении » Начало работы с Python для науки » это находится в разделе matplotlib, 1.4. Matplotlib: построение графиков, 1.4.2.4. Установка ограничений .
Ответ №2:
Если вам не нужна остальная часть вашего изображения, вы можете определить функцию, которая обрезает изображение по нужным координатам, а затем отображает обрезанное изображение.
Примечание: здесь ‘x’ и ‘y’ — это визуальные x и y (горизонтальная ось и вертикальная ось на изображении соответственно), что означает, что они инвертированы по сравнению с реальными x (строка) и y (столбец) массива NumPy.
import scipy as sp
import numpy as np
import matplotlib.pyplot as plt
def crop(image, x1, x2, y1, y2):
"""
Return the cropped image at the x1, x2, y1, y2 coordinates
"""
if x2 == -1:
x2=image.shape[1]-1
if y2 == -1:
y2=image.shape[0]-1
mask = np.zeros(image.shape)
mask[y1:y2 1, x1:x2 1]=1
m = mask>0
return image[m].reshape((y2 1-y1, x2 1-x1))
image = sp.lena()
image_cropped = crop(image, 240, 290, 255, 272)
fig = plt.figure()
ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)
ax1.imshow(image)
ax2.imshow(image_cropped)
plt.show()