Как импортировать (загрузить) изображение в python?
Примеры того, как импортировать (загрузить) изображение в python:
Импорт изображения с помощью matplotlib
Чтобы импортировать изображение в python, одним из решений является использование matplotlib:
Code language: JavaScript (javascript)from matplotlib import image from matplotlib import pyplot as plt img = image.imread("fav.jpg")
Code language: PHP (php)print(type(img)) print(img.shape)
Code language: HTML, XML (xml)class 'numpy.ndarray'>
(300, 450, 3)
3 соответствует режиму RGB.
После этого можно вывести изображение с помощью imshow из matplotlib в виде графика.
Code language: CSS (css)plt.imshow(img) plt.show()
Импорт изображения с помощью Pillow
Другое решение – использовать Pillow
Code language: JavaScript (javascript)from PIL import Image from matplotlib import pyplot as plt img= Image.open("fav.jpg")
type(img)
не является массивом numpy:
Code language: CSS (css)PIL.JpegImagePlugin.JpegImageFile
Тем не менее, все еще можно вывести изображение на экран с помощью imshow
Code language: CSS (css)plt.imshow(img) plt.show()
Для преобразования img в матрицу numpy
Code language: JavaScript (javascript)import numpy as np img = np.asarray(img)
Как открыть картинку через Python?
Чтобы открыть картинку, используя приложение по умолчанию, на Windows:
#!/usr/bin/env python import os os.startfile(r'D:\picture.jpg')
Отслеживать
ответ дан 31 мар 2015 в 21:45
52.2k 11 11 золотых знаков 108 108 серебряных знаков 311 311 бронзовых знаков
Открыть наверное значит загрузить для показа (или обработки)? Если да то попробуйте через PIL, примерно так:
from PIL import Image #. img = Image.open(r'D:\picture.jpg') img.show()
Отслеживать
47.5k 17 17 золотых знаков 56 56 серебряных знаков 99 99 бронзовых знаков
ответ дан 8 мар 2015 в 12:39
928 1 1 золотой знак 6 6 серебряных знаков 17 17 бронзовых знаков
Похоже, что человек хочет открыть ее в приложении по умолчанию, и при запуске из PyCharm что-то не так с окружением.
9 мар 2015 в 2:37
если использовать PIL, то картинка должна быть в папке с проектом?
9 мар 2015 в 14:09
Она может быть где угодно.
9 мар 2015 в 14:16
если обратный слэш есть в пути, то лучше r» константу использовать (в данном случае это не важно, так как ‘\p’ == r’\p’ , но в общем случае ‘\t’ != r’\t’ ).
31 мар 2015 в 21:43
Попробуйте так (картинка откроется в веб-браузере):
import webbrowser webbrowser.open(r"D:\picture.jpg")
Отслеживать
47.5k 17 17 золотых знаков 56 56 серебряных знаков 99 99 бронзовых знаков
ответ дан 17 мар 2015 в 4:36
Алексей Лобанов Алексей Лобанов
1,202 9 9 серебряных знаков 22 22 бронзовых знака
Вы можете это сделать, например, с помощью специализированных библиотек для обработки изображений и обработки данных. opencv требует установки дополнительных пакетов. Но, при этом, позволяет, помимо прочего, широкий спектр возможностей для обработки изображений. Вторая matplotlib устанавливается легко, интегрируется в pyCharm и позволяет использовать довольно удобный встроенный интерфейс для просмотра. К сожалению, эта библиотека не предоставляет возможности для обработки изображений, а только для их визуализации.
Opencv
import cv2 img = cv2.imread('x.jpg', 0) cv2.imshow('', img) cv2.waitKey(0)
matplotlib:
from matplotlib import pyplot as plt img = plt.imread('x.jpg') plt.imshow(img) plt.show()
matplotlib:
opencv:
Установка opencv:
sudo apt-get install -y cmake make libsm6 libxext6 libxrender-dev git clone https://github.com/opencv/opencv.git mkdir ./opencv/build cd ./opencv/build cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local .. make -j4 make install
Флаг j указывает число процессов, которые будут использованы при установке
Установка matplotlib:
pip install matplotlib pip install pillow
Если библиотека pillow не будет установлена, то можно будет пользоваться только * .png
Pillow — работа с картинками
Pillow — самая популярная библиотека для работы с изображениями в Python. С помощью неё картинки можно открывать, вращать, накладывать фильтры и даже работать с отдельными пикселями.
Обзор
Импортируется библиотека так:
from PIL import Image
Pillow — улучшенная версия библиотеки PIL , поэтому импортируется она таким странным образом. В коде она будет называться PIL .
Далее попробуем что-нибудь сделать с картинкой:
from PIL import Image image = Image.open("example.jpg") rotated_image = image.rotate(45) rotated_image.save("rotated.jpg")
Сначала открываем картинку с названием example.jpg и кладём её в переменную image . На следущей строке поворачиваем картинку на 45 градусов. Метод .rotate() не меняет картинку, а создаёт новую, поэтому положим её в переменную rotated_image . И в конце сохраняем повёрнутую картинку в новый файл rotated.jpg .
Атрибуты картинок
В Pillow есть новые типы данных: JpegImageFile , PngImageFile … Они позволяют хранить картинки прямо в переменных Python. У картинок есть несколько атрибутов, которые понадобятся вам в будущем:
- format — формат данных картинки: jpeg , png …
- mode — цветовая модель картинки: CMYK , RGB , L — для чёрно-белых изображений.
- width — ширина картинки в пикселях.
- height — высота картинки в пикселях.
- size — размер картинки в пикселях. Возвращает tuple : (ширина, высота).
Как их извлечь:
from PIL import Image image = Image.open("example.jpg") print(image.format) # Выведет JPG print(image.mode) # Например, может вывести RGB
Открыть картинку
Для открытия картинки используется функция Image.open() .
В качестве аргументов она принимает на вход путь до файла, который нужно открыть:
from PIL import Image image = Image.open("example.jpg")
Сохранить картинку в файл
Для сохранения картинки есть метод .save() .
В качестве аргументов он принимает:
- Путь до файла, в который сохранить картинку.
- Именованный необязательный параметр format , в котором передаётся формат сохраняемой картинки.
from PIL import Image image = Image.open("example.jpg") image.save("new.jpg") image.save("another.jpg", format="JPEG")
В качестве результата появится 2 копии картинки: new.jpg и another.jpg .
Перевести картинку в другую цветовую модель
О цветовой модели вы можете прочитать в разделе Атрибуты. Чтобы поменять цветовую модель картинки, нужно воспользоваться методом .convert() . Он принимает на вход именной аргумент mode :
from PIL import Image image = Image.open("example.jpg") print(image.mode) # Вывелось RGB cmyk_image = image.convert("CMYK") print(cmyk_image.mode) # Вывелось CMYK print(image.mode) # Вывелось RGB
Заметим, что метод не меняет исходную картинку, а создаёт её копию с цветовой моделью CMYK . Поэтому мы положили её в отдельную переменную.
Обрезать картинку
За обрезание картинки отвечает метод .crop() . Он принимает на вход кортеж из 4 чисел: координат углов новой картинки. Координаты отсчитываются с левого верхнего угла картинки:
Координаты нужно передать в таком порядке: слева, сверху, справа, снизу. Например, вы хотите отрезать 10 пикселей слева и 15 сверху:
from PIL import Image image = Image.open("example.jpg") coordinates = (10, 15, image.width, image.height) cropped = image.crop(coordinates) # Отрежется 10 пикселей слева и 15 сверху
Этот код отрезает 10 пикселей слева и 15 сверху. Самая правая координата — это и есть ширина картинки, а самая нижняя — высота, поэтому мы и использовали эти атрибуты картинки.
Разделить картинку на каналы
Картинки состоят из пикселей разных цветов. Каждый пиксель картинки в RGB состоит из 3 значений: сколько в нём красного, сколько зелёного и сколько синего. А в цветовой схеме CMYK из четырёх: голубой, пурпурный, жёлтый и чёрный. Все значения от 0 до 255. 0 — нет такого цвета, а 255 — его очень-очень много.
На самом деле картинки хранят не по пикселям, а по каналам. RGB картинка хранится как 3 картинки: в первой в каждом пикселе число от 0 до 255, показывающее, сколько в нём красного. Во второй то же, только с зелёным, а в третьем — с синим.
Получается 3 картинки. Но если взять какой-то цветовой канал отдельно от картинки, то она не будет знать, какой цвет ей показывать. У неё в каждом пикселе всего одно значение от 0 до 255. Поэтому она отображается как чёрно-белая. Если в пикселе хранится 0, то пиксель будет чёрный, а если 255 — белый. Чем больше число, тем светлее пиксель.
Метод .split() разбивает картинку на каналы. Работает так:
from PIL import Image image = Image.open("example.jpg") print(image.mode) # Вернуло CMYK, значит канала 4 cyan, magenta, yellow, key_color = image.split() # В переменные запишутся 4 чёрно-белые картинки.
Собрать картинку из каналов
Pillow позволяет разделять картинку на каналы. Но так же позволяет и собирать её обратно. За это отвечает функция Image.merge() . Она принимает на вход 2 аргумента:
- Цветовая модель будущей картинки
- Кортеж из цветовых каналов. Если модель RGB, то первый канал будет покрашен в красный, второй в зелёный, третий в синий.
from PIL import Image image = Image.open("example.jpg") print(image.mode) # Вернуло CMYK, значит канала 4 cyan, magenta, yellow, key_color = image.split() # В переменные запишутся 4 чёрно-белые картинки. new_image = Image.merge("CMYK", (cyan, magenta, yellow, key_color))
new_image ничем не отличается от image , т.к. состоит из тех же каналов в том же порядке.
Покрасить цветовой канал
Pillow позволяет раскрашивать чёрно-белые картинки. За это отвечает функция ImageOps.colorize() .
Она принимает 3 аргумента: Картинка, какой цвет показывать вместо чёрного и какой вместо белого. Пример:
from PIL import Image, ImageOps image = Image.open("example.jpg") colorized = ImageOps.colorize(image, black ="red", white ="yellow")
Код выше сделает из такой картинки:
Изменить размер картинки
Как работает thumbnail
Метод resize приводит картинку к желаемому размеру без сохранения пропорций. Картинка жмётся, становится некрасивой:
Метод thumbnail сохраняет пропорции:
Подробнее о thumbnail
С помощью метода .thumbnail() можно легко сделать миниатюру изображения. Миниатюра — уменьшенная версия картинки, с сохранением пропорций. На вход принимается кортеж с максимальными шириной и высотой. Метод .thumbnail() сам подберёт новые координаты так, чтобы картинка поместилась в заданную область. Например, у вас есть картинка 800×1200 и вы хотите поместить её в рамку 1200×600, то результат метода будет 400×600, т.к. 400×600 как раз помещается в 1200×600:
from PIL import Image image = Image.open("example.jpg") print(image.size) # Вывелось (800, 1200) image.thumbnail((1200, 600)) # Картинка теперь размера 400 на 600 print(image.size) # Вывелось (400, 600)
Наложить картинки друг на друга
Функция Image.blend() создаёт новую картинку, накладывая одно изображение поверх другого. Для работы ему необходимы три аргумента:
- Первая картинка.
- Вторая картинка, того же размера, что и первая.
- Коэффициент прозрачности.
Если прозрачность равна 0.5, то картинки смешаются в равных долях. Если коэффициент равен 1.0, то первая картинка станет полностью прозрачной и останется только вторая. Если 0.0, то наоборот. Прозрачность задаётся дробным числом через точку.
from PIL import Image image1 = Image.open("image1.jpg") image2 = Image.open("image2.jpg") image3 = Image.blend(image1, image2, 0.5) # Получится картинка, сложенная из двух
Наложить со смещением
Отдельного метода для этого нет, но получается за счёт комбинации .crop() и Image.blend().
- Выберите картинку для эффекта. У нас это картинка wave.png с шириной в 1000 пикселей.
- Отрежьте от неё 200 пикселей слева. Получится wave_left.png шириной 800 пикселей.
- Возьмите исходную картинку wave.png и отрежьте от неё по 100 пикселей с обоих сторон: слева и справа. Получится wave_middle.png тоже шириной в 800 пикселей.
- Наложите wave_left.png на wave_middle.png с помощью Image.blend()
- Сохраните в файл то, что получилось. Это картинка смещённая влево.
Попробуйте бесплатные уроки по Python
Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.
Переходите на страницу учебных модулей «Девмана» и выбирайте тему.
Инструменты для работы с изображениями в Python и Pillow
Автор телеграм-канала CODE BLOG Вадим Шванов написал для нас статью о работе с изображениями c использованием языка Python и Pillow. В ней он рассматривает основы работы с изображениями в Python, показывает, как создать фильтры для фотографий в библиотеке Pillow, преобразовать изображение в массив в библиотеке NumPy и использовать matplotlib для настраиваемого вывода результата на экран. Дочитайте до конца: там вы найдете ссылку на .ipynb-документ со всем используемым кодом, который вы сможете загрузить.
Кому это нужно?
- создание своего фоторедактора;
- создание масок для Instagram;
- анализ и распознавание образов в компьютерном зрении.
Освойте профессию
«Fullstack-разработчик на Python»
Fullstack-разработчик на Python
Fullstack-разработчики могут в одиночку сделать IT-проект от архитектуры до интерфейса. Их навыки востребованы у работодателей, особенно в стартапах. Научитесь программировать на Python и JavaScript и создавайте сервисы с нуля.
Профессия / 12 месяцев
Fullstack-разработчик на Python
Создавайте веб-проекты самостоятельно
А я справлюсь?
В инструкции используются простые операции, поэтому она подойдет для новичков — достаточно уметь немного кодить на Python.
Установка пакетов
NumPy и matplotlib можно установить с помощью пакетного менеджера pip, запустив следующие команды в терминале:
pip install numpy
pip install matplotlib
С Pillow сложнее: Python старше версии 3.6 поддерживает установку этого пакета через pip, а с другими версиями может возникнуть ошибка. Совместимость версий можно посмотреть тут.
Для этого примера в качестве среды разработки выбран Jupyter Notebook.
Начало работы
Импортируйте все необходимые модули и загрузите изображение в объект Python:
Как правило, NumPy импортируется с псевдонимом np, а matplotlib.pyplot — plt.
Загрузите изображение с помощью функции open() подмодуля Image:
Jupyter Notebook выводит изображения по их имени. Вот то самое изображение, путь к которому мы передали в функцию:
Далее мы создадим свою функцию, чтобы у нас была возможность добавить надпись над фотографией (заголовок) или изменить ее размер.
Вывод изображений с matplotlib
Это функция, которую мы будем использовать далее:
Она принимает два параметра: img — массив, который вы получили из исходной фотографии, и title — заголовок, который по умолчанию имеет значение None. Измените размеры фигуры на 6×6, чтобы сделать вывод изображения больше, и выведите его на экран. Также проверьте, был ли указан заголовок. Если нет — установите его с помощью функции title(). Выключите пометки на осях, указав ‘off’ в функции axis().
Станьте Fullstack-разработчик на Python и найдите стабильную работу
на удаленке
Как сделать изображение черно-белым
Здесь мы будем использовать метод convert() класса изображения PIL.
Функция выглядит просто:
Мы представили изображение в RGB-формате, то есть каждый пиксель имеет три значения: красный (R), зеленый (G) и синий (B). Оттенки серого получаются, когда все эти три значения равны. Есть известная формула яркости пикселя:
Но Pillow использует свои коэффициенты:
Изображение потеряло в качестве из-за того, что его растянули с помощью matplotlib.
Станьте Fullstack-разработчик на Python и найдите стабильную работу
на удаленке
Как переформатировать изображение в массив
Теперь мы будем использовать инструменты NumPy, поэтому желательно конвертировать изображение в np.array:
Конструктор массива принимает изображение в качестве аргумента и создает такой массив. Форму массива можно узнать с помощью поля shape.
224×225 — размеры нашего изображения. «3» появляется из-за того, что каждый пиксель представлен тремя значениями.
Как добавить фильтр «Негатив»
Значения цветов могут меняться от 0 до 255. Негатив — эффект инвертирования цветов. Достигается он просто: от 255 нужно отнять значение цвета. Так как все операции над массивом NumPy выполняются поэлементно, то мы отнимем от 255 текущий массив:
С помощью функции show() оценим результат:
Как отзеркалить изображение
Следующая задача — отражение изображения слева направо (т. е. правая и левая стороны изображения меняются местами). В NumPy есть функция fliplr. Про ее применение можно найти информацию здесь.
Передайте исходный массив в fliplr:
Этот фрагмент кода не изменяет массив, а возвращает новый, что нам и нужно. Оценим результат работы:
Как добавить эффект
Идея этого эффекта проста — нужно сделать изображение как можно синее. Для этого замените каждое третье «значение пикселя» на максимальное — 255.
Здесь нужно поменять сам массив, и, чтобы не потерять исходное изображение, скопируйте последовательность с помощью np.copy().
Другой вариант конструкции:
Весь код из статьи вы сможете найти в этом документе.