Python как сохранить изображение в файл

Обновлено: 28.06.2024

Во-первых, люди, увлекающиеся фотографией, едва ли не самое многочисленное полупрофессиональное сообщество в мире. Его популярности очень способствует распространение смартфонов и сервисов по работе с фотографиями, таких как Instagram и Pinterest .

Во-вторых, работа с видео сводится к работе с отдельными изображениями. Это относится и к профессиональным техникам наложения фильтров, и даже к работе с хромакеем , без которой не обходится практически ни один современный фильм.

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

Пока мы оставим за кадром вопросы скорости обработки изображений. С ними можно поэкспериментировать самостоятельно, это позволит обсудить скорость выполнения компилируемого и интерпретируемого кода. Кстати, для замеров времени тоже есть модуль — timeit.

2. Растровые изображения

Мы будем работать с растровыми изображениями, представляющими собой массив (таблицу) пикселей разных цветов.

Давайте посмотрим вот на это изображение.

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

Итак, изображение можно моделировать списком списков (двумерной таблицей, в которой лежат цвета). Осталось только подумать, как именно кодировать цвета.

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

В итоге нам нужен способ преобразования цветов в целые числа. Мы воспользуемся одной из самых популярных моделей представления цвета — RGB (Red, Green, Blue).

В модели RGB каждый из цветов представляется совокупностью трех компонентов: красного, синего и зеленого. Значение каждого компонента лежит в диапазоне от 0 (минимум) до 255 (максимум), занимая 1 байт в памяти.

На самом деле модели хранения этих байтов в памяти Python и файле с картинкой бывают очень сложными — например, со сжатием. Однако мы будем работать с исходными, «чистыми» данными.

Итак, каждый цвет — совокупность трех целых чисел (в Python ее можно представить кортежем или списком). Кстати, сумма этих трех чисел говорит о яркости пикселя: чем сумма больше, тем пиксель кажется ярче. На самом деле и тут все сложнее, чем кажется: яркость каждого компонента для глаза не одинакова, однако примем это упрощение.

Например, (0, 0, 0) — черный цвет. Его яркость минимальна, оттенков нет.

  • (255, 255, 255) — белый, максимальная яркость
  • (255, 0, 255) — очень насыщенный пурпурный (красный + синий)
  • (255, 255, 0) — ярко-желтый (красный + зеленый)
  • (100, 100, 100) — серый

Красный, зеленый и синий выбраны в качестве основных цветов из-за особенностей цветовой чувствительности рецепторов нашего глаза. Кстати, если мы сильно увеличим матрицу смартфона или монитора, который светит чистым белым светом, увидим что-то вроде этого:

Да-да, это (255, 255, 255).

Итак, для нас изображение — список списков, элементами которого будут кортежи цвета.

Кстати, легко заметить, что в нашей модели всего 256×256×256 = 16777216 разных цветов. Этого вполне достаточно, чтобы человеческий глаз не замечал дискретности (конечного числа оттенков) цветовой модели.

У Яндекса есть специальный барабан, который позволяет знакомиться c оттенками цвета, подбирать их и узнать их коды:

3. PIL. Установка библиотек

Для работы с изображениями мы будем использовать библиотеку PIL (Python image library), а точнее, ее модификацию под названием Pillow.


Установка пакетов

Для установки пакетов в Python служит специальная утилита командной строки pip, которая является еще и модулем.

Чтобы установить пакет, нужно выполнить команду pip install <Имя модуля>. Пакет будет скачан с PyPI и установлен, вы увидите примерно следующее:

Кроме опции install в pip, доступны команды:

Pillow — не чисто питоновская библиотека, она написана частично на языке С. Поэтому для некоторых версий Python может потребоваться компиляция кода доступным в системе С-компилятором, потому что pip сможет скачать только исходные коды библиотеки. Если такого компилятора нет (такое обычно бывает в windows-системах), стоит поискать скомпилированные версии в Интернете (готовые к установке файлы имеют расширение .whl).

Например, множество популярных библиотек можно найти на странице сайта лаборатории флуоресцентной динамики Калифорнийского университета.

Кроме того, чтобы не задумываться о сложностях при установке библиотек, можно установить дистрибутив Anaconda . В нем есть все необходимые библиотеки Python. И не только они.

4. Модельный пример

Рассмотрим пример работы с изображением, в котором мы:

  1. Пройдем по каждому пикселю в изображении.
  2. Получим для него значение цвета в RGB-нотации.
  3. Присвоим этому пикселю новое значение цвета (поменяем составляющие).
  4. В конце сохраним получившееся изображение с новым именем.

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

Для работы нам потребуется файл с изображением — Рианна.jpg, который нужно сохранить в тот же каталог, где будут лежать программы по его обработке.

Для работы с изображением нам нужен объект Image , который находится в библиотеке PIL (пишется большими буквами).

Функция open

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

Потом получаем список пикселей этого изображения, используя функцию load. Ее применяем к объекту, загруженному в переменную im. После применения функции получаем двумерный список, где для каждого пикселя хранится кортеж — цвет пикселя в палитре RGB.

Важно!

Обратите внимание: pixels устроен так, что индексация в нем идет кортежами, поэтому здесь запись pixels[i, j], а не pixels[i][j], что, возможно, было бы удобнее и привычнее. Это особенность библиотеки: создателям показалось, что так будет архитектурно уместнее.

С помощью атрибута size объекта im мы можем получить размер изображения, который хранится в виде кортежа: сначала ширину, потом высоту изображения в пикселях, что соответствует размерности pixels.

Далее переберем все элементы pixels (двумя циклами for) и для каждого элемента получим значение трех компонентов цвета. Запишем в массив pixels эти значения, но изменив порядок значений.

Для получения трех компонентов цвета каждого пикселя мы используем множественное присваивание, поэтому пишем

Множественное присваивание позволяет писать более простой и лаконичный код. Именно так мы поступили и в случае с вычислением x и у.

Затем при помощи функции save сохраняем измененный список пикселей в файл изображения с именем Рианна2.jpg.


Важно!

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

5. Создание изображений и рисование

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

Бывает такой заходишь на почту и видишь очередную подборку статей, которые никогда не прочитаешь, но тут так сошлись звезды, что и открыл статью, и прочел, и придумал, где на практике пригодится. А теперь хочу поделиться статьей с Хабром, чтобы если кому-то нужен будет простой и понятный гайд по работе с изображениями на Python — пожалуйста.

Pillow — это свободно распространяемая библиотека для работы с изображениями (далее Imaging Library) на Python с открытым исходным кодом, которая добавляет вашему коду поддержку открытия, изменения и сохранения изображений в различных расширениях.

Давайте начнем

Самый важный класс в Imaging Library Python — это класс Image, определенный в одноименном модуле. Мы используем open(), чтобы открыть изображение в нашей локальной директории, как показано ниже:

Это просто! Теперь вы умеете считывать изображения с помощью Pillow, а значит можно приступать к обработке изображения с его помощью. Вы также можете проверить тип изображения, которое мы только что загрузили.

Вы можете посмотреть свойства изображения, например:

Кроме того, вы можете вывести на экран изображение, используя метод show


Конвертирование расширения изображения

Когда вы закончите работать с изображением при помощи библиотеки Pillow в изначальном расширении, вы можете пересохранить его в других форматах, например, их jpg сделать png или многие другие.

Для примера, давайте попробуем написать простую программу на Python для преобразования всех изображений в каталоге вашего проекта, которые находятся в формате jpg, в формат png.


После того, как вы запустите приведенный выше код, в каталоге проекта, состоящем из изображений в формате jpg, откроются все изображения и преобразуются в .jpg, как показано на скриншоте. Вы можете повторить тот же процесс для преобразования изображений в другие преобразований.

Обрезка изображения

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


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

При этом первые две точки находятся (x, y) от верхней левой диагональной точки, а следующие две точки (x2, y2) также являются диагональной точкой снизу справа.

Геометрическое преобразование

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

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

Изменение размера изображения

Когда вы запустите приведенный выше код, вы должны увидеть новое изображение с измененным размером в вашем каталоге с размером 320 на 320.

Поворот изображения


Используйте функцию вращения для создания 360 изображений одного из того же изображения под разными углами — это поможет сгенерировать данные, которые вы потенциально можете использовать для обучения своей модели глубокого обучения.

Генератор изображений

После запуска скрипта, вы должны увидеть 360 изображений одного и того же исходного изображения с разным поворотом, как показано ниже.


Фильтрация изображений

Фильтрация — это метод изменения или улучшения изображения. Например, вы можете отфильтровать изображение, чтобы выделить определенные особенности или удалить другие.

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

В библиотеке Pillow доступно множество фильтров, включая BLUR, BoxBlur, CONTOUR, FIND_EDGES, Filter, GaussianBlur, Kernel, MaxFilter, MedianFilter, SHARPEN, SMOOTH и т.д.

Пример использования

Давайте попробуем найти края на изображении ниже, используя фильтр FIND_EDGES.


Таким же образом вы можете экспериментировать с другими фильтрами в Python библиотеке Pillow в зависимости от того, что вы пытаетесь сделать.

Чтение изображения из открытого файла

Кроме того, вы можете использовать Pillow для чтения изображения из файлового объекта Python, как показано ниже

Чтение изображения из URL

В этом случае вам придется использовать Pillow в сочетании с запросами. Запросы должны будут отправлять GET-request на сервер, чтобы получить необработанные байты изображения, а уже Pillow считает эти байты.


Создание новых изображений

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

Синтаксис:

Пример использования:


Рисование прямоугольников на изображениях

Pillow также может использоваться для рисования прямоугольника на изображениях. Обычно это делают при обнаружении объекта. При этом вы можете нарисовать не просто прямоугольник, а рамку над обнаруженным объектом.

Пример исползования

Давайте попробуем нарисовать прямоугольную рамку внутри пустого изображения.


Первые две координаты представляют (x, y) левой верхней части, а следующие две (x2, y2) представляют координатную точку правой нижней части.

Рисование текста на изображениях

Мы также можем использовать библиотеку Pillow для рисования текста на изображениях.


Matplotlib - одна из наиболее широко используемых библиотек визуализации данных в Python. Обычно графики и визуализации Matplotlib делятся с другими.

В этой статье мы рассмотрим, как сохранить график в виде файла изображения с помощью Matplotlib.

Создание сюжета

Сначала создадим простой сюжет:

Здесь мы построили синусоидальную функцию, начиная с 0 и заканчивая 10 с шагом 0.1 . Выполнение этого кода дает:


Теперь давайте посмотрим, как мы можем сохранить эту фигуру как изображение.

Сохранить график как изображение в Matplotlib

В предыдущем примере мы сгенерировали график с помощью функции plot() , передав данные, которые мы хотели бы визуализировать.

Этот график создается, но не отображается нам, если мы не вызываем функцию show() . Функция show() , как следует из названия, показывает сгенерированный участок пользователю в окне.

После создания мы также можем сохранить этот рисунок / график как файл - используя функцию savefig() :

Теперь, когда мы запускаем код, вместо всплывающего окна с графиком у нас есть файл ( saved_figure.jpg ) в каталоге нашего проекта.

Этот файл содержит точно такое же изображение, которое мы бы показывали в окне:


Стоит отметить, что функция savefig() не уникальна для экземпляра plt . Вы также можете использовать его на объекте Figure :

У функции savefig() есть обязательный аргумент filename . Здесь мы указали имя файла и формат.

Кроме того, она принимает другие варианты, такие как dpi , transparent , bbox_inches , quality и т.д.

В следующих разделах мы рассмотрим некоторые популярные варианты.

Настройка разрешения изображения

Параметр DPI определяет количество точек (пикселей) на дюйм. По сути, это разрешение создаваемого изображения. Давайте протестируем несколько разных вариантов:

Это приводит к появлению трех новых файлов изображений на нашем локальном компьютере, каждый с разным DPI:


Значение по умолчанию - 100 .

Сохраните прозрачное изображение с помощью Matplotlib

Аргумент transparent может быть использован для создания участка с прозрачным фоном. Это полезно, если вы будете использовать графическое изображение в презентации, на бумаге или хотите представить его в настройках индивидуального дизайна:

Если мы поместим это изображение на темный фон, это приведет к:


Изменение цвета графика

Вы можете изменить цвет подложки, используя аргумент facecolor . Он принимает color и по умолчанию white .

Изменим его на red :


Настройка границы изображения

Аргумент bbox_inches принимает строку и определяет границу вокруг граффика. Если мы хотим установить его так tight , то есть максимально обрезать рамку, мы можем установить аргументу bbox_inches значение 'tight' :

В результате получается плотно упакованная коробка. Это легче визуализировать, если для справки раскрасить края другим цветом:


Вывод

В этом уроке мы рассмотрели несколько способов сохранить график в виде файла изображения с помощью Matplotlib.

Для работы с графическими изображениями в Python есть ряд библиотек, в частности, библиотека Pyllow. Если у вас уже установлен pip то поставить Pillow не составит труда, просто используем команду python -m pip install pillow, которая автоматически скачает и установит библиотеку. Для использования библиотек просто подключаем ее через импорт:

Отобразит Python картинку, правда, стандартными средствами операционной системы, просто показав окно с картинкой.

А теперь чуть более сложный пример. Пусть у нас есть два изображения, такое:



Объединим их, используя интерполяцию между новым и старым:

Получив вот такой вот результат:




Возможно, на данном примере не совсем понятно. Хорошо, попробуем изображения попроще. Вот у нас две картинки:



Наложим их друг на друга методом blend с альфой 2:



Библиотека позволяет также формировать изображения и сохранять их в файл:

Вот что сделает данный код:


Только на этот раз изображение будет не на экран выведено, а в файл по указанному пути.

Выведем формат, тип, размер изображения:

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

Возможны и геометрические преобразования изображений, например, поворот на угол:

Python

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

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

Давайте рассмотрим популярные Python-библиотеки для работы с изображениями.

1. scikit-image

scikit-image — это Python­-пакет с открытым кодом, который работает с массивами NumPy . Он реализует алгоритмы и утилиты для использования в исследовательских, образовательных и промышленных приложениях. Это весьма простая и понятная библиотека даже для новичков в экосистеме Python. Данная библиотека содержит высококачественный и рецензированный код, написанный активным сообществом добровольцев.

Ресурсы

Библиотека хорошо задокументирована с обилием практических примеров. Ознакомиться с документацией можно здесь.

Примеры

Пакет импортируется как skimage , а большинство функций находится внутри подмодулей. Несколько примеров использования skimage :



Больше примеров доступно в галерее.

2. NumPy

NumPy — это одна из основных Python-библиотек с поддержкой массивов. Изображение представляет собой стандартный массив NumPy, содержащий пиксели точек данных. Таким образом, при выполнении основных NumPy-операций (срезы, маски, прихотливое индексирование) мы можем изменять пиксельные значения изображения. Само изображение можно загрузить через skimage и отобразить с помощью Matplotlib .

Ресурсы

Все ресурсы и документация доступны на официальной странице NumPy.

Пример

Маскирование изображения через NumPy:


3. SciPy

SciPy — это такой же важный научный модуль в Python, как и NumPy. Он подходит для решения основных задач по обработке и прочей работе с изображениями. В частности, в подмодуле scipy.ndimage доступны функции, которые работают в n-мерных массивах NumPy. Текущий пакет включает в себя функции для линейной и нелинейной фильтрации, бинарной морфологии, интерполяции В-сплайнами и измерений объектов.

Ресурсы

Полный список функций в пакете scipy.ndimage доступен в документации.

Пример

Использование SciPy для размытия изображений с помощью фильтра Гаусса:


4. PIL/ Pillow

PIL (Python Imaging Library) — это бесплатная Python-библиотека для открытия, работы и сохранения различных форматов изображений. К сожалению, ее разработка окончательно остановилась, а последнее обновление вышло в 2009. К счастью, есть Pillow — активно развивающийся форк PIL с простой установкой. Он работает на всех основных операционных системах и поддерживает Python 3. Библиотека содержит базовый функционал для обработки изображений, включая точечные операции, фильтры с набором встроенных ядер свертки и преобразование цветового пространства.

Ресурсы

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

Пример

Улучшение изображения через ImageFilter в Pillow:


5. OpenCV-Python

OpenCV (Open Source Computer Vision Library) — одна из самых популярных библиотек для приложений по компьютерному зрению.OpenCV-Python — это Python-версия интерфейса для OpenCV. Наличие кода на C/C++ в бэкенде гарантирует быстроту библиотеки, а Python­-обертка во фронтенде обеспечивает легкость настройки и развертывания. Благодаря этому OpenCV-Python является отличным решением для высоконагруженных вычислительных программ по компьютерному зрению.

Ресурсы

Руководство по OpenCV2-Python поможет быстрее освоиться в библиотеке.

Пример

Наглядный пример использования OpenCV-Python при наложении изображения с помощью пирамид. В результате мы создаем новый фрукт под названием «аплоко».


6. SimpleCV

SimpleCV — это еще один фреймворк с открытым кодом для создания приложений по компьютерному зрению. С ним у вас появляется доступ к нескольким мощным библиотекам компьютерного зрения (например, OpenCV) без необходимости изучения глубины цвета, файловых форматов, цветовых пространств и т.д. Кривая обучения куда меньше, чем в OpenCV, и, как говорится в их слогане, «компьютерное зрение становится проще». Парочка плюсов SimpleCV:

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

Ресурсы

Понятная документация с множеством практических примеров.

Пример


7. Mahotas

Mahotas также является Python-библиотекой для компьютерного зрения и обработки изображений. Она содержит стандартные функции по обработке изображений (фильтры и морфологические операции), а также современные возможности компьютерного зрения для вычисления признаков (обнаружение особых точек и локальные дескрипторы). Быстрота разработки обеспечивается Python-интерфейсом, а плюсом для скорости служат алгоритмы на С++. Mahotas — это быстрая библиотека с минималистичным кодом и зависимостями. Более подробно описано в документации.

Ресурсы

Документация содержит инструкции по установке, практические примеры, а также пошаговые уроки по освоению Mahotas.

Пример

Mahotas решает задачи с помощью простого кода. Для задачи «Где Уолли?» Mahotas требуется минимальное количество кода. Вот исходный код.



8. SimpleITK

ITK или Insight Segmentation and Registration Toolkit — это кросс-платформенная система с открытым кодом, предоставляющая расширенный набор инструментов для анализа изображений. Сюда относится и SimpleITK — упрощенный слой, «надстроенный» поверх ITK. Данный слой облегчает работу с библиотекой при быстром прототипировании, обучении и интерпретируемых языках. SimpleITK — это набор инструментов для анализа изображений с большим количеством компонентов, поддерживающих общую фильтрацию, сегментацию и регистрацию изображений. Сам SimpleITK написан на C++, но доступен для многих языков программирования, включая Python.

Ресурсы

Jupyter Notebook показывает использование SimpleITK в образовательных и исследовательских целях. Он также демонстрирует возможности SimpleITK по интерактивному анализу изображений с использованием языков программирования Python и R.

Пример

Анимация ниже — это визуализация процесса преобразования при регистрации КТ- и МРТ-снимков в SimpleITK и Python. Исходный код доступен здесь.

9. pgmagick

pgmagick — обертка на базе Python для библиотеки GraphicsMagick. Систему GraphicsMagickиногда называют швейцарским ножом в обработке изображений. Она предлагает коллекцию эффективных инструментов и библиотек, поддерживающих чтение, запись и операции с изображениями в более чем 88 основных форматах, включая DPX, GIF, JPEG, JPEG-2000, PNG, PDF, PNM и TIFF.

Ресурсы

pgmagick посвящен целый репозиторий Github. Там вы найдете инструкции по установке и основные требования. Также имеется подробное руководство пользователя.

Примеры

Вот несколько операций с изображениями, которые можно выполнить в pgmagick:



10. PyCairo

PyCairo представляет собой набор привязок Python-кода для графической библиотеки Cairo. Cairo — это 2D-библиотека для отрисовки векторной графики. Векторная графика интересна тем, что не теряет своей четкости при изменении размеров или трансформации. PyCairo — это набор привязок для Cairo, с помощью которых можно вызывать Cairo-команды из Python.

Ресурсы

Подробная информация по установке и работе доступна в GitHub-репозитории PyCairo. Есть еще вводное руководство с кратким описанием PyCairo.

Примеры

Отрисовка линий, базовых фигур и радиальных градиентов.


Заключение

Существует ряд полезных и бесплатных библиотек по обработке изображений в Python. Какие-то из них широко известны, а о некоторых вы слышите впервые. Поработайте с разными библиотеками и подберите ту, что подходит именно вам.

Читайте также: