Pillow изменить цвет пикселя

Обновлено: 06.05.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 мы можем не только изменять существующие изображения, но и создавать новые.

изменение цвета пикселя в изображении. Библиотека PIL Python

В прошлой статье мы узнали как установить библиотеку PIL в Python и начать уже с ней работать. В этой статье мы продолжаем изучение библиотеки PIL. Начиная с версией 1.1.6 метод load() возвращает объект, с помощью которого можно получить доступ к отдельным пикселям изображения. Указав два значения внутри квадратных скобок, можно получить или задать цвет пикселя.

Для доступа к отдельному пикселю вместо метода load() можно использовать методы getpixel() и putpixel(). Метод getpixel(<Координаты>) позволяет получить цвет указанного пикселя, а метод putpixel(<Координаты>, <Цвет>) изменяет цвет пикселя. Координаты пикселя указываются в виде кортежа из двух элементов. Необходимо заметить, что эти методы работают медленнее метода load(). Пример использования метода getpixel() и putpixel() приведен ниже.

Использование метода getpixel() и putpixel()

В этом примере для просмотра изображения мы воспользовались методом show(). Метод show() создает временный файл в формате BMP и запускает программу для просмотра изображения, используемую в операционной системе по умолчанию. Например, на моем компьютере запускается программа ACDSee. Для сохранения изображения в файл предназначен метод save().

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

Сохраняем изображение в Python

Обратите внимание на то, что мы открыли файл в формате JPEG, а сохранили его в формате BMP. Таким образом, можно открывать изображения в одном формате и конвертировать его в другой формат. Если сохранить изображение не удалось, возбуждается исключение IOError. Если параметр <Формат> не указан, то формат изображения определяется по расширению файла.

В параметре <Обции> можно указать дополнительный характеристики изображения. Поддерживаемый опции зависят от формата изображения. Например, по умолчанию изображения в формате JPEG сохраняются с качеством 75. С помощью опции quality можно указать другое значение в диапазоне от 1 до 100.

За дополнительной информации по опциям обращайтесь к документации. Так же для более подробной инструкции игры в покер можете прочитать poker правила и повысить свои навыки в этой игре. Удивите своих знакомых во время игры в покер, продемонстрировав им свой профессионализм игры.

Бывает такой заходишь на почту и видишь очередную подборку статей, которые никогда не прочитаешь, но тут так сошлись звезды, что и открыл статью, и прочел, и придумал, где на практике пригодится. А теперь хочу поделиться статьей с Хабром, чтобы если кому-то нужен будет простой и понятный гайд по работе с изображениями на 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 для рисования текста на изображениях.

Контраст – это расстояние между цветами. Если увеличить контраст, цвета станут более яркими.

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

Как настроить?

  • Прочтите изображение с помощью Image.open().
  • Создайте усилитель ImageEnhance.Contrast() для изображения.
  • Увеличьте контраст изображения с помощью методаhance() на требуемый коэффициент.

Регулируя коэффициент, вы можете регулировать контраст изображения.

В то время как коэффициент 1 дает исходное изображение. Установка коэффициента в сторону 0 делает изображение более серым, а коэффициент> 1 увеличивает контраст изображения.

Пример

В следующем примере мы изменим контраст изображения с коэффициентом 1, что дает исходное изображение. Затем с коэффициентом 1,5, что увеличивает контраст изображения. А затем с коэффициентом 0,5, что делает изображение серым.

Регулировка контрастности изображения в Pillow Python

Изображение с увеличением контрастности:

Изображение с увеличением контрастности

Тусклое изображение – с пониженной контрастностью:

Тусклое изображение – с пониженной контрастностью

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

Регулировка резкости изображения

Вы можете изменить резкость изображения с помощью класса ImageEnhance библиотеки PIL.

В этом руководстве мы узнаем, как повысить резкость или размыть изображение с помощью класса ImageEnhance библиотеки Python Pillow (PIL) с помощью некоторых хорошо иллюстрированных примеров.

Пошаговая инструкция

  • Прочтите изображение с помощью Image.open().
  • Создайте усилитель ImageEnhance.Sharpness() для изображения.
  • Увеличьте резкость изображения с помощью методаhance() на требуемый коэффициент.

Регулируя коэффициент, вы можете сделать изображение более резким или размытым.

В то время как коэффициент 1 дает исходное изображение, factor >1 увеличивает резкость изображения, а factor <1 – размывает изображение.

Пример 1

В следующем примере мы увеличим резкость изображения с коэффициентом 1, что даст исходное изображение. Затем с коэффициентом 2, что даст более резкое изображение. А затем с коэффициентом 0,05, что даст размытое изображение.

Исходное изображение

Изображение с повышенной резкостью:

Изображение с повышенной резкостью

Размытое изображение

В этом уроке на примерах Python мы узнали, как настроить резкость изображения с помощью функции ImageEnhance.Sharpness().

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

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

Увеличение яркости делает изображение белее, а уменьшение яркости делает изображение темнее.

Пошаговая инструкция

  1. Прочтите изображение с помощью Image.open().
  2. Создайте усилитель ImageEnhance.Brightness() для изображения.
  3. Увеличьте яркость изображения с помощью методаhance() на требуемый коэффициент.

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

В то время как коэффициент 1 дает исходное изображение. Если установить коэффициент, равный 0, изображение станет черным, а коэффициент> 1 сделает изображение ярче.

Пример 1: с помощью PIL

В следующем примере мы сделаем изображение ярче с коэффициентом 1, что даст исходное изображение. Затем с коэффициентом 1,5, что даст более яркое изображение. А затем с коэффициентом 0,5, что даст затемненное изображение.

Исходное изображение

Более яркое изображение – с повышенной яркостью:

Более яркое изображение – с повышенной яркостью

Затемненное изображение – с уменьшенной яркостью:

Затемненное изображение – с уменьшенной яркостью

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

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