В этом руководстве мы изучим, как использовать библиотеку OpenCV в Python.
OpenCV — это библиотека с открытым кодом, поддерживающая множество платформ, включая Windows, MacOs и Linux. Также эта библиотека существует и для многих языков программирования. Но наиболее часто она используется для написания приложений машинного обучения на языке Python, особенно в сфере компьютерного зрения.
Помимо кроссплатформенности и поддержки многих языков программирования, которые позволяют использовать приложения на различных системах, библиотека OpenCV весьма эффективна (по сравнению с другими похожими библиотеками) с точки зрения вычислений, так как почти все функции и операторы в ней векторизированны.
В этой статье мы научим вас устанавливать библиотеку OpenСV на платформы Windows, MacOS и Linux. Также мы расскажем про операции с изображениями, арифметику изображений, сглаживание изображений и геометрические трансформации изображений при помощи библиотеки OpenCV. Приступим!
Установка библиотеки
Замечание: так как мы рассматриваем использование библиотеки OpenСV для языка Python, то неявно подразумевается, что сам Python ( версии 3) у вас уже установлен. Для установки библиотеки OpenCV выполните одну из следующих команд, в зависимости от вашей операционной системы.
Уроки Python / Модуль tkinter (работа с картинками)
Windows
$ pip install opencv-python
MacOS
$ brew install opencv3 —with-contrib —with-python3
Linux
$ sudo apt-get install libopencv-dev python-opencv
Для проверки результата установки просто введите в терминале Python следующую команду:
Если не появилось сообщение об ошибке, значит библиотека была установлена успешно.
Основные операции с изображениями
Установив OpenCV, давайте теперь, так сказать, пощупаем основные функциональные возможности данной библиотеки.
Вывод изображения на экран
Процесс вывода изображения на экран состоит из двух шагов. Сначала мы должны загрузить изображение, а после этого вывести его на экран. Эти операции выполняются последовательно, и для каждой из них предназначена отдельная функция.
Для вывода изображения на экран нам необходимо задать две вещи:
- Путь к файлу, в котором содержится изображение (подойдет как относительный, так и абсолютный путь).
- Режим чтения файла (только чтение, запись, и т.д.).
Функция, при помощи которой мы считываем изображение, называется cv2.imread() . У нее есть три режима работы. Первый — это IMREAD_GRAYSCALE . Как видно из названия, он преобразует изображение в черно-белое с оттенками серого. Второй — IMREAD_UNCHANGED , он загружает изображение без обрезания альфа-канала. И третий, используемый по умолчанию, — IMREAD_COLOR . Он просто загружает цветное изображение, используя RGB-каналы.
Вот пример кода:
import cv2 my_bike = cv2.imread(‘bike.png’)
Таким образом мы загружаем изображение велосипеда из файла bike.png и сохраняем его в переменную my_bike для дальнейшей работы.
Распознавание объектов на Python | Поиск объектов на изображении | TensorFlow, PixelLib
Замечание: если в результате выполнения данного кода возникла ошибка, есть только три возможных причины для этого. Первая — вы неправильно задали путь к файлу. Вторая — такого файла просто не существует, и третья — тип изображения (jpg/jpeg/png) задан неверно.
Теперь давайте выведем на экран только что загруженное изображение. Для этого используется функция cv2.imshow() . Если вы пользовались Matlab, ее работа должны быть вам знакома.
Первый параметр функции imshow() — это строка, которую мы хотим использовать в качестве заголовка к нашему изображению. Второй параметр — это переменная, содержащая загруженное нами изображение.
Сохранение изображений
Для сохранения результатов нашей работы с изображениями в библиотеке OpenCV существует функция cv2.imwrite() .
Вот пример ее использования:
Здесь мы задали название файла и переменную, в которой содержится изображение. Оно будет сохранено в текущую рабочую директорию.
Арифметика изображений
Арифметика изображений включает в себя сложение, вычитание, деление и умножение различных изображений и используется для получения нового изображения при помощи арифметических операций со входными изображениями. Арифметика изображений имеет множество практических применений, как например нанесение водяного знака на картинку, смешение двух изображений, применение к картинкам различных фильтров и так далее.
Из всего множества возможных операций мы рассмотрим только два примера, которые помогут нам понять концепцию арифметических операций в библиотеке OpenСV. В качестве первого примера мы возьмем сложение двух изображений, а в качестве второго — их смешение (blending).
Давайте рассмотрим код этих примеров.
Сложение изображений
import cv2 # Считываем два изображения image_1 = cv2.imread(‘bike.jpg’) image_2 = cv2.imread(‘car.jpg’) # Суммируем массивы двух изображений по всем каналам result = cv2.add(image_1, image_2) cv2.imshow(‘result’, result) cv2.waitKey(0) cv2.destroyAllWindows()
Команда waitkey используется для остановки выполнения кода до нажатия любой кнопки клавиатуры. Это весьма удобно, так как в противном случае выведенное на экран изображение только на долю секунды мелькнуло бы на экране, а затем программа завершила бы свое исполнение.
Смешение изображений
Смешение изображений весьма похоже на их сложение, за исключением того, что теперь мы можем контролировать вклад каждого из входящих изображений в результирующее. В общем случае, если мы хотим, чтобы одно из входящих изображений было более контрастным, а другое более размытым при их слиянии, мы должны вместо сложения изображений использовать их смешение.
Чтобы прояснить это, давайте рассмотрим код:
import cv2 # Считываем два изображения image_1 = cv2.imread(‘bike.jpg’) image_2 = cv2.imread(‘car.jpg’) result = cv2.addWeighted(image_1, 0.9, image_2, 0.1) cv2.imshow(‘result’, result) cv2.waitKey(0) # Программа останавливается до нажатия любой клавиши cv2.destroyAllWindows()
Сумма весов, передающихся в функцию cv2.addWeighted() , должна быть равна 1 . Также в конце в функцию можно передать скалярную величину, которая будет добавлена к значению каждого пикселя результирующего изображения.
Замечание: изображения могут быть любого типа, но тип всех изображений должен быть одинаковым. Например, если вы используете формат PNG, то все изображения должны быть именно в этом формате.
Сглаживание изображений
Сглаживание изображений является крайне полезной операцией и очень часто используется перед тем как передать картинку для обработки в модель машинного обучения. В основном это нужно делать для фильтрации высокочастотных шумов, применяя для этого низкочастотный фильтр. Существует множество различных фильтров, например усредняющий фильтр (box filter), медианный фильтр (median filter), фильтр типов волн (модовый фильтр, mode filter), фильтр Гаусса (Gaussian filter) и многие другие. Но для понимания сглаживания изображений и его применения в библиотеке OpenCV, мы рассмотрим только первый, усредняющий фильтр (box filter).
Допустим, у вас есть изображение размером 10X10 и вы хотите его пропустить через усредняющий фильтр размером 3Х3. Как вы будете действовать?
Создание и чтение изображения в Pillow Python
Чтобы создать новое изображение с помощью библиотеки Python Pillow PIL, используйте метод Image.new().
Синтаксис
Синтаксис метода Image.new():
new(mode, size, color=0)
- mode – это режим изображения, например, RGB, RGBA, CMYK и т.д;
- size – это кортеж с шириной и высотой изображения в качестве элементов, значения ширины и высоты указаны в пикселях;
- color предназначен для закрашивания всех пикселей, в зависимости от режима значения могут быть предоставлены для каждой полосы в целом в виде кортежа. Параметр цвета является необязательным, значение цвета по умолчанию – 0.
Пример 1
В этом примере мы создадим новое изображение в режиме RGB с размером (400, 300). Мы не будем указывать цвет, поэтому методы new() считают значение цвета по умолчанию 0 – для каналов RGB будет черным цветом.
from PIL import Image width = 400 height = 300 img = Image.new( mode = «RGB», size = (width, height) ) img.show()
Метод show() отобразит изображение на вашем ПК с помощью приложения для просмотра изображений по умолчанию.
Пример 2: с определенным цветом фона
В этом примере мы создадим новое изображение с режимом RGB, размером (400, 300) и цветом (209, 123, 193), соответствующим красному, зеленому и синему каналам соответственно.
from PIL import Image width = 400 height = 300 img = Image.new( mode = «RGB», size = (width, height), color = (209, 123, 193) ) img.show()
Пример 3: с определенным цветовым режимом
В наших предыдущих примерах мы использовали режим RGB для создания изображения. Давайте попробуем с другим режимом, например CMYK.
from PIL import Image width = 400 height = 300 img = Image.new( mode = «CMYK», size = (width, height), color = (209, 123, 193, 100) ) img.show()
В этом руководстве на примерах Python мы узнали, как создать новое изображение с помощью метода Image.new() библиотеки Pillow с помощью примеров программ.
Как прочитать изображение?
В этом руководстве мы узнаем, как читать или открывать изображение с помощью библиотеки Pillow, а также различные ситуации, с которыми можно столкнуться, с помощью примеров программ.
- Импортировать изображение из библиотеки PIL.
- Используйте метод Image.open() и передайте путь к файлу изображения в качестве аргумента. Функция возвращает объект Image. Вы можете сохранить этот объект изображения и применить к нему операции с изображением.
Пример 1: с использованием PIL
В следующем примере мы будем читать изображение с помощью функции Image.open() пакета PIL.
from PIL import Image im = Image.open(«sample-image.png»)
Image.open() возвращает объект типа класса PIL.PngImagePlugin.PngImageFile.
В этом примере файл изображения помещается в то же место, что и файл примера python. Если вы хотите прочитать изображение, находящееся в другом месте, вы должны указать полный путь.
В следующем примере программы мы предоставим полный путь к входному изображению.
from PIL import Image im = Image.open(«D:/images/sample-image.png»)
Пример 2
В этом примере мы моделируем скрипт, в котором мы указываем неверный путь к Image.open(). Другими словами, файл не существует по указанному нами пути.
from PIL import Image im = Image.open(«D:/images/no-image.png»)
Поскольку файл изображения отсутствует в этом месте, Image.open() выдает FileNotFoundError.
Traceback (most recent call last): File «d:/workspace/example.py», line 3, in im = Image.open(«D:/images/sample-image.png») File «C:UserspythonexamplesorgAppDataLocalProgramsPythonPython37libsite-packagesPILImage.py», line 2652, in open fp = builtins.open(filename, «rb») FileNotFoundError: [Errno 2] No such file or directory: ‘D:/images/sample-image.png’
Пример 3: без расширения
В этом примере мы попытаемся прочитать изображение без расширения. Мы не указываем расширение изображения, если это JPG, PNG и т.д.
from PIL import Image im = Image.open(«D:/sample»)
Image.open() определяет кодек изображения, используя данные и метаданные, присутствующие в содержимом изображения.
Источник: tonais.ru
Визуализация данных с Python-фреймворком Dash
Визуализация данных является неотъемлемой частью Data Science. И сегодня мы поговорим о фреймворке визуализации данных на Python — Dash, который позволяет работать не только с интерактивными графиками, но и выводить их на веб-сайт. Читайте у нас: инициализация приложения, работа с графиками и данными, а также использование обратных вызовов (callback) в Dash.
Что такое Dash
Dash — это фреймворк для построения веб-приложений на Python. Он написан с использованием Flask, React.js, Plotly.js и является инструментом для интерактивной визуализации, которую можно интегрировать в веб-сайт. При этом для работы с ним не требуются знания ни Flask, ни React, ни JavaScript.
Зная только Python, некоторые тэги HTML и базовые графики Plotly, можно реализовать разные проекты по визуализации данных в рамках Data Science, например:
- 3D-изображение мозга человека [1],
- детектирование объектов на изображении на основе методов глубокого обучения (Deep Learning) [2],
- диаграммы word embeddings [3] и многое другое.
Установить Dash можно с помощью пакетного менеджера Pip, который дополнительно установит такие зависимости как Plotly и Flask:
pip install dash
Простое Dash-приложение
Напишем свое первое приложение с Dash. Ниже представлен код на Python, который нужно сохранить в отдельном файле и запустить его через терминал. Запускается приложение как обычный Python-файл: python my_file.py . После запуска будет выведен адрес, по которому нужно перейти через браузер.
import dash import dash_html_components as html app = dash.Dash(‘my_first_app’) app.layout = html.H1(‘Hello’) app.run_server(debug=True)
Это приложение лишь выводит на веб-странице слово Hello. Разберемся с кодом:
- Инициализация приложение осуществляется через dash.Dash , где мы указываем название приложения;
- Атрибут layout определяет, что будет на веб-странице. Здесь мы указали, что на странице будет отображён только заголовок h1 (тэг ). Все компоненты HTML находятся в модуле dash_html_components ;
- Запускается приложение через run_server. Мы установили debug=True , чтобы иметь возможность отладить код. В случае если приложение готово для работы на сервере, то, в целях безопасности, флаг следует поставить в значение False.
Добавляем график
Поскольку Dash — веб-фреймворк для визуализации данных, добавим в наше приложение график. В модуле dash_core_components есть класс Graph , который отвечает за работу с диаграммами Plotly. Воспользуемся им, тогда Python-код будет выглядеть следующим образом:
import dash_core_components as dcc app = dash.Dash(‘my_first_app’) app.layout = html.Div([ html.H1(‘Hello’), Graph( figure= < ‘data’: [ ] >, ) ]) app.run_server(debug=True)
В тэге будут располагаться заголовок h1 и график Plotly.
Добавляем данные
Выше мы составили очень простой линейный график, но в Data Science проектах часто приходится сталкиваться с данными, которые требуют разные виды диаграмм. Сымитируем данные с помощью Python-библиотеки Pandas, а затем построим столбчатую диаграмму с помощью Plotly. Чтобы построить столбчатую диаграмму, воспользуемся функцией bar из модуля plotly.express :
import plotly.express as px import pandas as pd df = pd.DataFrame(< «Fruit»: [«Apples», «Oranges», «Bananas», «Apples», «Oranges», «Bananas»], «Amount»: [4, 1, 2, 2, 4, 5], «City»: [«SF», «SF», «SF», «Montreal», «Montreal», «Montreal»] >) fig = px.bar(df, x=»Fruit», y=»Amount», color=»City», barmode=»group»)
Отображение остаётся все тем же: в тэге будет находится заголовок h1 и столбчатая диаграмма, которую мы создали из наших данных:
app.layout = html.Div([ html.H1(‘Hello’), dcc.Graph(figure=fig) ])
Обратные вызовы (callbacks)
df = pd.read_csv(‘https://raw.githubusercontent.com/plotly/datasets/master/gapminderDataFiveYear.csv’) app = dash.Dash(‘app’) app.layout = html.Div([ dcc.Graph(id=’my-graph’), dcc.Slider( , min=df[‘year’].min(), max=df[‘year’].max(), value=df[‘year’].min(), marks=, step=None ) ])
Теперь создадим функцию, внутри которой будем определять форму графика (scatter). Эта функция будет соответственно задекорирована:
Отметим основные положения:
- Декоратор имеет Output (выход), Input (вход) из модуля dash.dependencies . Input принимает входной id и его значение, в нашем случае это id слайдера ( year-slider ), а значение — это год. Ouput принимает выходной id и его значение, в нашем случае это id графика ( my-graph ), а значение — сам график;
- Декорируемая функция может иметь любое название и должна принимать столько аргументов, сколько значений в Input указано. В нашем случае Input имеет входное значение — выбранный на слайдере год;
- Внутри декорируемой функции выбираются данные с выбранным годом на слайдере и строится график (scatter);
- Декорируемая функция должна возвращать значение Output , как уже было сказано, это сам график.
В результате, мы получили график, который изменяется в зависимости от выбранного на слайдере года:
Подобное использование декоратора, когда в ответ на изменение значения Input изменяется значения Output, называется Реактивным программированием. Его можно сравнить с созданием таблиц в MS Excel — когда значение одной ячейки изменяется, то вслед за ней обновляются зависимые ячейки. Реактивное программирование используется при создании пользовательских интрефейсов. Но имеет ограничение в виде значительной траты вычислительных ресурсов, поскольку нужно всегда следить за состоянием приложения.
В следующей статье поговорим о том, как в Dash работать со множеством Input и Output. А ещё больше подробностей о визуализации данных в Plotly и Dash для решения реальных задач Data Science, вы узнаете на специализированном курсе «VIP: Визуализация данных на языке Python» в лицензированном учебном центре обучения и повышения квалификации IT-специалистов в Москве.
- https://dash-gallery.plotly.host/dash-brain-viewer/
- https://dash-gallery.plotly.host/self-driving/
- https://dash-gallery.plotly.host/dash-word-arithmetic/
Источник: python-school.ru