Рисование в PyQt5
Система рисования PyQt5 способна обрабатывать векторную графику, изображения и шрифты. Рисование необходимо в приложениях, когда мы хотим изменить или улучшить существующий виджет, или мы создаём пользовательский виджет с нуля. Чтобы сделать рисунок, мы используем API рисования, предоставленное инструментарием PyQt5.
Рисование делается в рамках метода paintEvent(). Код рисования размещается между методами begin() и end() объекта QPainter. Он выполняет низкоуровневое рисование на виджетах и других элементах.
Рисование текста
Мы начинаем с рисования Unicode-текста в окне.
В нашем примере, мы рисуем русский текст. Текст выровнен вертикально и горизонтально.
Рисование делается в пределах paintEvent.
Класс QPainter отвечает за все низкоуровневое рисование. Все методы рисования идут между методами begin() и end().
Фактическое рисование делегируется пользовательскому методу drawText().
Здесь мы определяем ручку и шрифт, которые используются, чтобы рисовать текст.
Метод drawText() рисует текст в окне. Метод rect() события рисования возвращает прямоугольник, который должен быть обновлён.
Рисование точек
Точка – это самый простой графический объект, который может быть нарисован. Это маленькое пятнышко в окне.
В нашем примере, мы произвольным образом рисуем 1000 красных точек в окне.
Мы устанавливаем ручку красного цвета. Мы используем предопределённую цветовую константу Qt.red.
Каждый раз, когда мы меняем размер окна, вызывается paintEvent. Мы получаем текущий размер окна с помощью метода size(). Мы используем размер окна, чтобы распределять точки по всему окну.
Мы рисуем точку с помощью метода drawPoint().
Цвета
Цвет – это объект, представляющий собой комбинацию красного, зелёного и синего (RGB) значений интенсивности. Корректные значения RGB находятся в диапазоне от 0 до 255. Мы можем определить цвет разными способами. Самый распространённый – десятичные или шестнадцатеричные значения RGB. Мы также можем использовать значения RGBA, которые обозначают красный, зелёный, синий и альфа-канал. Здесь мы добавляем немного дополнительной информации относительно прозрачности. Значение альфа 255 определяет полную непрозрачность, 0 – полная прозрачность, т.е. цвет невидим.
В нашем примере, мы рисуем 3 окрашенных прямоугольника.
Здесь мы определяем цвет, используя шестнадцатеричную систему счисления.
Здесь мы определяем кисть и рисуем прямоугольник. Кисть – это элементарный графический объект, который используется, чтобы рисовать фон очертания. Метод drawRect() принимает четыре параметра. Первые два – значения x и y на осях. Третий и четвёртый параметры – ширина и высота прямоугольника. Метод рисует прямоугольник, используя текущие ручку и кисть.
QPen (ручка) – это элементарный графический объект. Он используется, чтобы рисовать линии, кривые и контуры прямоугольников, эллипсов, многоугольников и других фигур.
В нашем примере, мы рисуем шесть линий. Линии рисуются в шести разных стилях ручки. Существует пять предопределённых стилей QPen. Мы также можем создать пользовательские стили. Последняя линия нарисована с использованием пользовательского стиля.
Мы создаём объект QPen. Цвет – чёрный. Ширина устанавливается в 2 пикселя так, чтобы мы могли видеть различия между стилями ручки. Qt.SolidLine – это один из предопределённых стилей (жирная линия).
Здесь мы определяем пользовательский стиль ручки. Мы устанавливаем стиль ручки Qt.CustomDashLine и вызываем метод setDashPattern(). Список чисел определяет стиль. Может быть даже несколько чисел. Нечётные числа определяют сплошную линию, чётные числа – промежутки. Чем больше число, тем больше промежуток или штрих. Наш образец – штрих в 1 пиксель, промежуток в 4 пикселя, штрих в 5 пикселей, промежуток в 4 пикселя, и т.д.
То, что получилось, хорошо видно на картинке.
QBrush
QBrush – это элементарный графический объект. Он используется для рисования фона графических форм, таких как прямоугольники, эллипсы или многоугольники. Кисть может быть трёх разных типов: предопределённая кисть, градиент, образец текстуры.
В нашем примере, мы рисуем девять разных прямоугольников.
Мы определяем объект кисти. Мы устанавливаем его в объект рисования и рисуем прямоугольник с помощью метода drawRect().
В этой части руководства PyQt5, мы рассмотрели некоторые основы рисования.
Введение в обработку изображений в Python при помощи Pillow
Бывает такой заходишь на почту и видишь очередную подборку статей, которые никогда не прочитаешь, но тут так сошлись звезды, что и открыл статью, и прочел, и придумал, где на практике пригодится. А теперь хочу поделиться статьей с Хабром, чтобы если кому-то нужен будет простой и понятный гайд по работе с изображениями на Python — пожалуйста.
Pillow — это свободно распространяемая библиотека для работы с изображениями (далее Imaging Library) на Python с открытым исходным кодом, которая добавляет вашему коду поддержку открытия, изменения и сохранения изображений в различных расширениях.
Давайте начнем
Самый важный класс в Imaging Library Python — это класс Image, определенный в одноименном модуле. Мы используем open(), чтобы открыть изображение в нашей локальной директории, как показано ниже:
Это просто! Теперь вы умеете считывать изображения с помощью Pillow, а значит можно приступать к обработке изображения с его помощью. Вы также можете проверить тип изображения, которое мы только что загрузили.
Вы можете посмотреть свойства изображения, например:
Кроме того, вы можете вывести на экран изображение, используя метод show
Конвертирование расширения изображения
Когда вы закончите работать с изображением при помощи библиотеки Pillow в изначальном расширении, вы можете пересохранить его в других форматах, например, их jpg сделать png или многие другие.
Для примера, давайте попробуем написать простую программу на Python для преобразования всех изображений в каталоге вашего проекта, которые находятся в формате jpg, в формат png.
Обрезка изображения
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 для рисования текста на изображениях.
Пишем графическую программу на Python с tkinter
В работе со студентами и учениками я заметила, что при изучении какого-либо языка программирования большой интерес вызывает работа с графикой. Даже те студенты, которые скучали на заданиях про числа Фибоначчи, и уже казалось бы у них пропадал интерес к изучению языка, активизировались на темах, связанных с графикой.
Поэтому предлагаю потренироваться в написании небольшой графической програмки на Python с использованием tkinter (кроссплатформенная библиотека для разработки графического интерфейса на языке Python).
Код в этой статье написан для Python 3.5.
Задание: написание программы для рисования на холсте произвольного размера кругов разных цветов.
Не сложно, возможно программа «детская», но я думаю, для яркой иллюстрации того, что может tkinter самое оно.
Хочу рассказать сначала о том, как указать цвет. Конечно удобным для компьютера способом. Для этого в tkinter есть специальный инструмент, который можно запустить таким образом:
Примечание: как сказано в коментариях ниже — звёздочка не все импортирует, надёжнее будет написать
from tkinter import colorchooser
Можно для определения цвета рисования использовать английские название цветов. Здесь хочу заметить, что не все они поддерживаются. Тут говорится, что без проблем вы можете использовать цвета «white», «black», «red», «green», «blue», «cyan», «yellow», «magenta». Но я все таки поэкспериментировала, и вы увидите дальше, что из этого вышло.
Для того, чтобы рисовать в Python необходимо создать холст. Для рисования используется система координат х и у, где точка (0, 0) находится в верхнем левом углу.
В общем хватит вступлений — начнем.
10 инструментов Python для работы с изображениями
Обзор самых популярных Python-библиотек с простым и понятным способом преобразования изображений
Введение
Наш сегодняшний мир переполнен данными, большая часть которых состоит из изображений. Однако для работы с изображениями требуется их обработка. Обработка изображений — это процесс анализа и работы с цифровым изображением, направленный на улучшение качества картинки или извлечения информации для дальнейшего использования.
Общие задачи сводятся к отображению изображения и выполнению основных операций (кадрирование, отражение, вращение, сегментация, классификация, извлечение признаков, восстановление и распознавание). Python является отличным средством для решения подобных задач. Благодаря доступности и растущей популярности Python в качестве языка научно-технического программирования, внутри экосистемы появилось множество первоклассных инструментов для обработки изображений.
Давайте рассмотрим популярные Python-библиотеки для работы с изображениями.
1. scikit-image
Ресурсы
Библиотека хорошо задокументирована с обилием практических примеров. Ознакомиться с документацией можно здесь.
Примеры
Больше примеров доступно в галерее.
2. NumPy
Ресурсы
Все ресурсы и документация доступны на официальной странице 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. Какие-то из них широко известны, а о некоторых вы слышите впервые. Поработайте с разными библиотеками и подберите ту, что подходит именно вам.
Рисуем геометрические фигуры в Python с помощью Pillow
Модуль ImageDraw из библиотеки обработки изображений Pillow (PIL) предоставляет методы для рисования круга, квадрата и прямой линии в Python.
Содержание статьи
Создание объекта Draw в Python
Здесь создается пустое изображение с размером 500 на 300 пикселей и с тёмно желтым фоном.
Рисуем фигуры в Pillow: ellipse, rectangle и line
Вызываем методы рисования из объекта Draw для рисования фигур на нашем желтом фоне.
Рисуем эллипс, прямоугольник и прямую линию в качестве примера.
Справочник по параметрам методов рисования
Даже если, способы рисования отличаются в зависимости от используемого метода, следующие параметры являются общими для всех.
Область рисования — xy
Параметр xy указывает прямоугольную область для рисования новой фигуры.
Уточняется один из следующих форматов:
Метод line() рисует прямую линию, которая связывает каждую точку, polygon() рисует многоугольник, а метод point() рисует точку в 1 пиксель для каждой указанной точки.
Параметр fill — заполняем фигуру определенным цветом
Параметр fill указывает какой цвет будет использован для заполнения нашей геометрической формы.
Спецификация формата цвета отличается в зависимости от указанного режима изображения (объект Image ):
Значение по умолчанию None (не заполнено).
Есть три способа указать цвет, возьмем красный цвет, его можно записать так:
Стоит учесть тот факт, что текстовый формат не имеет все цвета, кол-во доступных цветов ограничено в коде самой библиотеки. Вот весь список: https://github.com/python-pillow/Pillow/blob/8.1.0/src/PIL/ImageColor.py#L148
Лучше всего использовать шестнадцатеричный формат #FFFFFF (белый).
Параметр outline — цвет границ
Параметр outline указывает на цвет границы фигуры.
Спецификация формата цвета такая же, как и у параметра fill которого мы обсуждали выше. Значение по умолчанию равно None (без границ).
Параметр width — размер границ
Вне зависимости от рисуемой фигуры, вы можете указать размер в пикселях для границы фигуры.


























