Рубрики
Без рубрики

Matplotlib imshow – полезное иллюстрированное руководство

Учитесь отображать и манипулировать изображениями в Matplotlib с функцией imshow [+ бонусное видео]

Автор оригинала: Adam Murphy.

Я всегда боролся с plt.imshow () Метод Python Матплотлиб библиотека. Чтобы помочь вам и я осваиваю это, я написал самый глубокий ресурс об этом в Интернете.

Как бонусный ресурс, вы можете играть в мою пошаговое видео, которое берет вас через весь код в этой статье:

Чтобы показать изображение в MatPlotlib, сначала прочитайте его в использовании plt.imread () Затем отобразите его с помощью plt.imshow () Отказ

import matplotlib.pyplot as plt

cat_img = plt.imread('Figures/cat.jpeg')
plt.imshow(cat_img)

Чтобы повернуть (раздражающий) ось, выключите, позвоните PLT.AXIS («ВЫКЛ») Отказ

cat_img = plt.imread('Figures/cat.jpeg')
plt.axis('off')
plt.imshow(cat_img)

Намного лучше! Но есть намного больше, чем вы можете сделать, чем просто показать изображения. Давайте посмотрим, как это работает более подробно.

Пример matplotlib imshow

Когда вы отображаете в изображении в MatPlotlib, есть 2 шага, которые вам нужно предпринять: сначала вы читаете изображение, а затем покажете его.

Вы читаете на изображении, используя plt.imread () и пропустите это строку. У меня есть изображения, хранящиеся в каталоге, называемом Цифры Итак, я сначала пишу Фигуры/ сопровождается названием изображения с его расширением файла – cat.jpeg Отказ Если ваши изображения хранятся в вашем текущем рабочем каталоге, вы можете опустить Фигуры/ Отказ

Я храним вывод plt.imread () В переменной с описательным именем, потому что вам нужно передать это на plt.imshow () Отказ Итак, первая строка – cat_img.imread ('figures/cat.jpeg') Отказ

Изображения состоят из пикселей, а каждый пиксель – точка цвета. Изображение CAT составляет 1200 × 800 пикселей. Когда изображение загружено в компьютер, он сохраняется как массив чисел. Каждый пиксель в цветовом изображении состоит из красной, зеленой и синей (RGB) части. Это может принять любую ценность от 0 до 255 с 0 темным, а 255 – самым ярким. На изображении серого каждого пикселя каждый пиксель представлен всего одним числом от 0 до 1. Если пиксель 0, он полностью черный, если это 1, он полностью белый. Все между ними – оттенок серого.

Итак, если изображение кота было черно-белым, это было бы 2D Numpy Array С формой (800, 1200) Отказ Как это цветное изображение, на самом деле это 3D Numpy Array (для представления трех разных цветовых каналов) с формой (800, 1200, 3) Отказ

Обратите внимание, что numpy пишет размеры изображения – это противоположный способ MATPLOTLIB и «реальный мир». Numpy находится из мира математики и матриц, где вы всегда пишете количество строк (высота), а затем столбцы (ширина). Если вам нужен Quick Numpy Refeher, посмотрите мою глубину Numpy Toutiator в этом блоге.

MATPLOTLIB основывает свои функции изображения на «реальном мире», и поэтому отображается ширина, а затем высота.

Давайте посмотрим на тип и размер CAT_IMG Отказ

cat_img = plt.imread('Figures/cat.jpeg')

print(type(cat_img))
# 

print(cat_img.shape)
# (800, 1200, 3)


(800, 1200, 3)

После того, как вы прочитаете свое изображение в Numpy Array, пришло время отображать его с помощью plt.imshow () Отказ Это похоже на PLT.Show () который вы звоните в конце любого участка MatPlotlib. Однако, в отличие от PLT.Show () , вы должны пройти изображение, которое вы хотите отобразить как аргумент. Это полезно, если вы прочитали несколько изображений, но хотите только отобразить определенное количество из них.

plt.imshow(cat_img)

Я не уверен, почему, но, по умолчанию, все изображения отображаются с осью клещей и этикетки. Это может быть довольно раздражает, поэтому звоните PLT.AXIS («ВЫКЛ») удалить их.

Тем не менее, клещи и этикетки могут быть полезны, если вы хотите выбрать только часть изображения. Используя их как гиды, я буду нарезать CAT_IMG Чтобы просто получить голову нашего милого котенка.

# Slicing found by using axis ticks and lables on image above
cat_head = cat_img[150:450, 275:675, :]
plt.imshow(cat_head)

Вышеуказанное изображение представляет собой JPEG, но вы также можете отображать другие типы файлов изображений, таких как PNGS.

# A png image
snow_img = plt.imread('Figures/snowboarder.png')
plt.axis('off')
plt.imshow(snow_img)

Вы можете отображать GIFS, но немного сложнее сделать это, и поэтому находится за пределами объема этой статьи. Если вы прочитаете и показать GIF, используя вышеуказанные шаги, MATPLOTLIB просто покажет одну из его кадров.

janice = plt.imread('Figures/janice.gif')
plt.axis('off')
plt.imshow(janice)

Matplotlib imshow the gershale.

Вы можете превратить любое цветное изображение в изображение в серого цвета в MatPlotlib. Поскольку изображения оттенков серого представляют собой 2D Numpy массивы, используйте Slicing, чтобы включить 3D-массив в 2D.

cat_img = plt.imread('Figures/cat.jpeg')

# Turn 3D array into 2D by selecting just one of the three dimensions
grayscale_cat = cat_img[:, :, 0]

Если вы пишете cat_img [:,:, 1] или cat_img [:,:, 2] Вы получите разные массивы, но окончательное изображение все равно будет выглядеть одинаково. Это связано с тем, что изображения в оттенках серого просто заботятся о относительной разнице интенсивности между каждым пикселем, и это одинаково на каждом канале RGB.

Давайте построим это и посмотрим, что произойдет.

plt.axis('off')
plt.imshow(grayscale_cat)

Чего ждать?

Не волнуйтесь, вы ничего не сделали не так! Вы создали образ серого изображения, но MATPLOTLIB применил к нему ColororMap автоматически. Это происходит, даже если вы выбираете второе или третье измерение в вашем GrayScale_cat определение.

Чтобы сделать это серого, установите CMAP Аргумент ключевых слов на «серый» в plt.imshow () Отказ

plt.axis('off')
plt.imshow(grayscale_cat, cmap='gray')

Идеально! Теперь вы можете легко превратить любое цветовое изображение в серого в серого в Matplotlib. Но есть еще много цветов, из которых вы можете выбрать. Давайте подробно посмотрим на все нормы.

Matplotlib imshow colormap.

Есть Много разных сортов Вы можете подать заявку на ваши изображения. Просто пропустите имя для CMAP Аргумент ключевых слов в plt.imshow () И ты добрые идти. Я рекомендую вам играть с ними, поскольку большинство имен не значат для вас, что ничего не значат на первом чтении.

Colormap по умолчанию – виридис Отказ Давайте явно применим его к нашему изображению кота.

# Turn cat_img into a 2D numpy array 
colored_cat = cat_img[:, :, 0]
plt.axis('off')
plt.imshow(colored_cat, cmap='viridis')

Я мог бы написать целую статью о COOLORMAPS – на самом деле, создатель Морной сделал Отказ Это увлекательная тема. Выбор правильного может сделать ваш сюжет невероятно и выбирать плохое, можно испортить его.

Для начинающих Matplotlib рекомендует Воспринимательно единообразным последовательно Colormaps, как они хорошо работают и легко на глазах. Вот список их всех.

percp_uniform_seq_cmaps = ['viridis', 'plasma', 'inferno', 'magma', 'cividis']

Вы уже видели виридис Итак, давайте покажем остальные на сетке 2 × 2 (если вы не знаете Как сделать подломы в Matplotlib Проверьте мою статью).

fig, axes = plt.subplots(nrows=2, ncols=2)
cmaps = ['plasma', 'inferno', 'magma', 'cividis']

for ax, cmap in zip(axes.flat, cmaps):
    ax.imshow(colored_cat, cmap=cmap)
    ax.set(title=cmap)
    ax.axis('off')
plt.show()

Сокраща вполне похожи и легко посмотреть. Они не искажают изображение, а максимума и минимумы все еще можно увидеть.

Вот некоторые другие обычаи, которые я выбрал случайным образом. Обратите внимание, насколько нечетными некоторые из них являются, особенно Флаг !

fig, axes = plt.subplots(nrows=2, ncols=3, figsize=plt.figaspect(1/2))
cmaps = ['jet', 'binary', 'RdYlGn', 'twilight', 'Pastel1', 'flag']

for ax, cmap in zip(axes.flat, cmaps):
    ax.imshow(colored_cat, cmap=cmap, label=cmap)
    ax.set(title=cmap)
    ax.axis('off')
plt.show()

Matplotlib imshow colorbar.

Если ваше изображение имеет к нему ColormapaP, вы можете сказать читателю, что означает каждый цвет, предоставив Colorbar. Использовать PLT.COLORBAR () добавить один.

plt.imshow(colored_cat, cmap='hot')
plt.axis('off')
plt.colorbar()

Помните, что каждое значение в массиве, представляющем цветное изображение, представляет собой число от 0 до 255, и поэтому Colorbar отражает это.

Обратите внимание, что я позвонил plt.imshow () на первой строке. В отличие от PLT.Show () , вы можете изменить изображения после звонка plt.imshow () И изменения будут применены к выходу.

Matplotlib imshow размер

Как с каждым Рисунок в Matplotlib Вы можете вручную установить Рисунок Размер. Просто позвоните PLT.Figure () Наверх и установите фигес аргумент Вы можете либо установить его на определенный размер в дюймах или установить соотношение сторон:

  1. plt.figure (figsize = (8, 6)) – 8 дюймов в ширину, 6 дюймов высокий
  2. PLT.Figure (figsize = plt.figaspect (2)) – соотношение сторон 2, то есть в два раза выше, чем он широкий.

Примечание. Регистрация по умолчанию можно найти, позвонив plt.rcparams ['fire.figsize'] И это (6.4, 4.8) дюймы.

Посмотрим, что произойдет, когда мы изменим Рисунок Размер нашего изображения кота.

# 1 inch wide x 1 inch tall...?
plt.figure(figsize=(1, 1))

cat_img = plt.imread('Figures/cat.jpeg')
plt.axis('off')
plt.imshow(cat_img)

Это, безусловно, меньше, чем оригинал. Но это не похоже, что это 1 × 1 дюйма – это явно шире, что он высокий. Но похоже, одна из сторон правильно, что лучше, чем ничего.

Давайте постараемся сделать его шириной 1 дюйма и высотой 3 дюйма.

# 1 inch wide x 3 inches tall...?
plt.figure(figsize=(1, 3))

cat_img = plt.imread('Figures/cat.jpeg')
plt.axis('off')
plt.imshow(cat_img)

Теперь изображение не изменилось вообще. Что происходит?

Когда вы разместите изображения в большинстве программ, таких как Microsoft Word или Google Pields, они поддерживают свои оригинальные соотношения высоты/ширины. Это называется сохранение соотношения аспекта изображения и обычно очень хорошая вещь. Он гарантирует, что пиксели на изображении не искажены, когда вы их разместите. Это также поведение по умолчанию в Matplotlib.

Если вы действительно хотите искажать изображение и заполнить все место, доступное в Рисунок изменить аспект Аргумент ключевых слов в plt.imshow () Отказ

Есть только два возможных значения аспект :

  1. «Равный» – (по умолчанию) сохраняет соотношение сторон, то есть длины боковой части пикселей равны (квадрат)
  2. «Авто» – не сохраняет соотношение сторон

Давайте посмотрим на те же примеры, что и выше, но набор ASPECT = 'AUTO' Отказ

# 1 inch wide x 1 inch tall (definitely)
plt.figure(figsize=(1, 1))

cat_img = plt.imread('Figures/cat.jpeg')
plt.axis('off')
plt.imshow(cat_img, aspect='auto')

Большой! Теперь изображение явно 1 × 1 дюйма, но он пришел за счет небольшого искажения изображений.

Давайте еще больше искажаемся.

# 1 inch wide x 3 inches tall (definitely)
plt.figure(figsize=(1, 3))

cat_img = plt.imread('Figures/cat.jpeg')
plt.axis('off')
plt.imshow(cat_img, aspect='auto')

Идеально! Очевидно, что изображение искажено, но теперь вы знаете, как это сделать.

Примечание. Значение аспекта по умолчанию может быть изменено для всех изображений, установив plt.rcparams ['image.aspect'] Отказ

Резюме

Теперь вы знаете основы отображения изображений с MATPLOTLIB.

Вы понимаете, почему вам нужно сначала прочитать изображения из файла и хранить их в качестве Numpy Array ( Numpy Tutorial здесь ), прежде чем отображать их с помощью plt.imshow () Отказ Вы знаете, как прочитать в разных типах файлов изображений (HINT – если это неподвижное изображение, это тот же процесс, независимо от типа файла!).

Если вы хотите установить конкретный сормер, вы используете CMAP Аргумент ключевых слов, и вы также можете включить цветное изображение в оттенок серого. Наконец, вы можете добавить Colorbar и изменить размер вашего изображения, чтобы быть все, что вы хотите.

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

Куда пойти отсюда?

Вы хотите, чтобы вы могли быть программистом на полный рабочий день, но не знаете, как начать?

Ознакомьтесь с чистым упаковочным величином, где Chris – Creator of Finxter.com – учит вас стать фрилансером Python в 60 дней или вернуть деньги!

https://tinyurl.com/become-a-python-freelancer

Неважно, если вы начинаете питон или Python Pro. Если вы не делаете шесть фигур/год с Python прямо сейчас, вы узнаете что-то из этого вебинара.

Это доказаны, методы NO-BS, которые получают ваши результаты быстро.

Этот вебинар не будет онлайн навсегда. Нажмите на ссылку ниже, прежде чем сиденья наполнится и научитесь стать фрилансером Python, гарантированно.

https://tinyurl.com/become-a-python-freelancer

Преобразование WordPress от imshow.ipynb by nb2wp v0.3.1

Expert Writer & Content Creator – наука о науке и машине. – Я помогаю образовательным компаниям создавать привлечение в блоге и видеоконтентах преподавания данных науки для начинающих. В отличие от моих конкурентов, я узнаю новые концепции каждый день и так понимаю, что это нравится быть студентом. Мои статьи легко понять, эффективны и приятно читать. Мои видео достойны, участвуют и подробно. – Работать со мной, пожалуйста, обратитесь к Upwork https://tinyurl.com/hire-adam-murphy