Инвертировать ось Y изображения, не переворачивая его вверх ногами - PullRequest
3 голосов
/ 06 июля 2019

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

У меня есть следующий код

import matplotlib.pyplot as plt
import numpy as np
img_path = '/path/to/image.tif'
img = plt.imread(img_path)
plt.imshow(img, cmap = 'gray')

, оно создает следующее изображение: enter image description here

Изображения могут быть получены там

Я пытался plt.gca().invert_yaxis() без успеха

Что мне делать

1 Ответ

3 голосов
/ 06 июля 2019

Поведение по умолчанию imshow состоит в том, чтобы поместить начало системы координат в верхний левый угол.Это отличается от построения научных данных, таких как два объекта x и y друг против друга, где начало координат, то есть точка, соответствующая координате (0,0), находится в нижнем левом углу с (положительной) осью X, продолжающейся вправо, и (положительной) осью Y, продолжающейся к вершине.

Последняя является всего лишь научным соглашением, хотя оно уходит в глубь веков.Можно утверждать (хотя и невозможно сделать резервную копию с историческими свидетельствами), ось x традиционно выровнена слева направо, потому что именно так текст написан на многих языках, а ось y ориентирована к вершине, как люди интуитивно понимают. увеличение - очень похоже на высоту рельефа.

С другой стороны, для изображений существующее соглашение основано на расположении в памяти данных пикселей и способе расположения последовательных пикселейна холсте: слева направо в первой строке (по той же логике, что и выше), затем снова слева в следующей строке и т. д. для всех остальных строк, идущих сверху вниз.Точно так же, как слова, размещенные на странице - на языках, написанных слева направо и, намного более универсально, сверху вниз.

Именно по этой причине ось Y в вашем изображении ориентирована так, как оноявляется.Чтобы увеличить значения y снизу вверх, вы можете вызвать опцию origin='lower', чтобы входные данные интерпретировались в соответствии с научным соглашением.Однако затем вам также необходимо перевернуть линии изображения вверх ногами , чтобы при отображении на экране изображение отображалось в его предполагаемой ориентации.Это потому, что то, что раньше было первой строкой, когда изображение было загружено в память, теперь соответствует последней координате y, той, которая находится вверху.

Нижняя строка (каламбур не непреднамеренный), просто вызовите imshowкак в приведенном выше коде:

plt.imshow(np.flipud(img), cmap='gray', origin='lower')

Чтобы проиллюстрировать это, приведу отдельный пример, демонстрирующий поведение:

from imageio import imread
image = imread('https://upload.wikimedia.org/wikipedia/commons'
               '/thumb/6/6a/Mona_Lisa.jpg/158px-Mona_Lisa.jpg')

from matplotlib import pyplot
figure = pyplot.figure(tight_layout=True)
(axes1, axes2, axes3) = figure.subplots(nrows=1, ncols=3)

axes1.set_title("origin='upper'")
axes1.imshow(image)

axes2.set_title("origin='lower'")
axes2.imshow(image, origin='lower')

axes3.set_title("'lower' + flipped")
axes3.imshow(image[::-1], origin='lower')

pyplot.show()

В примере требуется ImageIO быть установленным для получения образца изображения.Его вывод:

output of demo script

Подобные вопросы:

...