Поведение по умолчанию 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 быть установленным для получения образца изображения.Его вывод:
Подобные вопросы: