OpenCV
OpenCV (Open Source Computer Vision Library) — это открытая библиотека для работы с алгоритмами компьютерного зрения, машинным обучением и обработкой изображений. Написана на C++, но существует также для Python, JavaScript, Ruby и других языков программирования. Работает на Windows, Linux и MacOS, iOS и Android.
Освойте профессию «Data Scientist»
Где используется OpenCV
OpenCV может использоваться везде, где нужно компьютерное зрение. Эта отрасль IT работает с технологиями, которые позволяют устройству «увидеть», распознать и описать изображение. Компьютерное зрение дает точную информацию о том, что изображено на картинке, с описанием, характеристиками и размерами (с определенной степенью достоверности).
Также библиотека работает с машинным обучением — отраслью, которая обучает алгоритмы действовать тем или иным образом.
- в робототехнике— для ориентирования робота в пространстве, распознавания объектов и взаимодействия с ними;
- медицинских технологиях— для создания точных методов диагностики, например 3D-визуализации органа при МРТ;
- промышленных технологиях— для автоматизированного контроля качества, считывания этикеток, сортировки продуктов и пр.;
- безопасности— для создания «умных» камер видеонаблюдения, которые реагируют на подозрительные действия, для считывания и распознавания биометрии;
- мобильной фотографии — для создания бьюти-фильтров, изменяющих лицо приложений;
- на транспорте— для разработки автопилотов.
Профессия / 24 месяца
Data Scientist
Дата-сайентисты решают поистине амбициозные задачи. Научитесь создавать искусственный интеллект, обучать нейронные сети, менять мир и при этом хорошо зарабатывать. Программа рассчитана на новичков и плавно введет вас в Data Science.
Функции OpenCV
Работа со структурами данных
Для хранения и работы с изображениями OpenCV использует векторы и скаляры, матрицы и диапазоны. Они позволяют проводить математические преобразования, ориентироваться по изображению и выполнять множество других действий.
Видоизменение изображений
С помощью OpenCV с картинкой можно работать как в графическом редакторе: обрезать, увеличивать или уменьшать, вращать. В основном программисты используют эту возможность для предварительной подготовки картинки перед ее расшифровкой — например, обрезают ненужные части.
Добавление эффектов
Картинку можно сделать в оттенках серого или полностью черно-белой. Это важно для алгоритмов распознавания, которые работают с обесцвеченными изображениями. Можно изменять цветовой тон, размывать, сглаживать или геометрически изменять картинку.
Рисование поверх изображения
На картинку можно нанести линии и геометрические фигуры, сделать подпись, например, чтобы выделить найденное программой лицо. Часто это используется в мобильных приложениях для камеры: квадрат вокруг лица человека во время съемки означает, что программа распознала его.
Станьте дата-сайентистом и решайте амбициозные задачи с помощью нейросетей
Распознавание объектов
Для распознавания элементов в OpenCV используются очертания объектов, сегментация по цветам, встроенные методы распознавания, которые можно настраивать в зависимости от объекта и чувствительности алгоритма.
Работа с видеороликами
Новые версии библиотеки поддерживают работу не только с картинками, но и с видео. Они могут считывать ролики с использованием кодеков, анализировать происходящее в них, отслеживать движения и элементы. Это полезно, например, при программировании движущегося робота или создании ПО для камеры видеонаблюдения.
Из чего состоит OpenCV
Сейчас структура OpenCV — это множественные модули для разных целей:
- хранения математических функций и вычислений, алгебры и структур данных;
- хранения моделей для машинного обучения;
- ввода и вывода картинок или видео, чтения и записи в файл;
- обработки изображения;
- распознавания примитивов;
- детектирования объектов — лиц, предметов и других;
- отслеживания и анализа движений на видео;
- обработки трехмерной информации;
- ускорения работы библиотеки;
- хранения устаревшего или еще не готового кода и других.
Каждый модуль узко специализирован. Их не нужно скачивать отдельно: в пакет установки включена вся основная функциональность библиотеки.
Преимущества OpenCV
Активное сообщество
OpenCV для Python, JavaScript, Ruby и других языков программирования используют по всему миру, в том числе в Google и Microsoft. Поэтому вокруг библиотеки существует активное сообщество. Это полезно и для новичков, и для экспертов. Документация по OpenCV представлена на нескольких языках, в том числе на русском. Скачать полный исходный код последней версии можно на этой странице.
Бесплатный доступ
OpenCV распространяется по бесплатной лицензии и для учебного, и для коммерческого использования. У библиотеки открытый исходный код, который может просмотреть любой программист. Это дает большую гибкость в работе с OpenCV и позволяет самостоятельно узнать, как реализована та или иная функция.
Обилие алгоритмов
OpenCV включает более 2500 инструментов и алгоритмов компьютерного зрения и машинного обучения. Этого достаточно для решения сложных задач по распознаванию и обработке изображений.
Высокая скорость
Библиотека работает быстрее масштабного и тяжелого ПО для математических вычислений, такого как Matlab. Поэтому ее можно использовать в ситуациях, когда требуется быстро обработать картинку.
Возможность работы в реальном времени
Благодаря высокой скорости и кроссплатформенности OpenCV подходит для работы с изображениями в режиме реального времени. Это открывает ряд возможностей: от создания ПО для бьюти-фильтров в социальных сетях до разработки систем, которые автоматически поднимают тревогу при подозрительных действиях на камерах.
Недостатки OpenCV
Сложность в освоении
Чтобы хорошо понимать все возможности OpenCV, нужно знать теории компьютерного зрения и машинного обучения. Поэтому порог входа в отрасль выше, чем в других популярных направлениях IT.
Отсутствие кодов обработки ошибок
Если возникла ошибка, в OpenCV бывает сложно понять, где именно. Поэтому при отладке программ у новичков могут быть проблемы.
Ориентированность на большие платформы
OpenCV работает на масштабных платформах. Если запустить ее на микроконтроллере, одноплатном компьютере, производительность будет невысокой.
Как установить OpenCV в Python
Для установки OpenCV необходимо установить актуальную версию Python, а затем в зависимости от ОС выполнить одну из команд.
Windows
$ pip install opencv-python
MacOS
$ brew install opencv3 —with-contrib —with-python3
Linux
$ sudo apt-get install libopencv-dev python-opencv
Чтобы проверить, была ли установка OpenCV успешной, нужно выполнить следующую команду в оболочке Python, командной строке либо терминале: import cv2
Если при импорте cv2 не появилось сообщения об ошибке, значит, библиотека установлена правильно.
Data Scientist
Дата-сайентисты решают поистине амбициозные задачи. Научитесь создавать искусственный интеллект, обучать нейронные сети, менять мир и при этом хорошо зарабатывать. Программа рассчитана на новичков и плавно введет вас в Data Science.
Статьи по теме:
- Идеальный костюм для вечеринки: AI советует, каким героем из «Мстителей» нарядиться на Хэллоуин
- Дайджест SkillFactory: ТОП-7 статей по Data Science (часть 1)
- Как написать программу для распознавания лиц
OpenCV в Python. Часть 1
Привет, Хабр! Запускаю цикл статей по библиотеке OpenCV в Python. Кому интересно, добро пожаловать под кат!
Введение
OpenCV — это open source библиотека компьютерного зрения, которая предназначена для анализа, классификации и обработки изображений. Широко используется в таких языках как C, C++, Python и Java.
Установка
Будем считать, что Python и библиотека OpenCV у вас уже установлены, если нет, то вот инструкция для установки python на windows и на ubuntu, установка OpenCV на windows и на ubuntu.
Немного про пиксели и цветовые пространства
Перед тем как перейти к практике, нам нужно разобраться немного с теорией. Каждое изображение состоит из набора пикселей. Пиксель — это строительный блок изображения. Если представить изображение в виде сетки, то каждый квадрат в сетке содержит один пиксель, где точке с координатой ( 0, 0 ) соответствует верхний левый угол изображения. К примеру, представим, что у нас есть изображение с разрешением 400×300 пикселей. Это означает, что наша сетка состоит из 400 строк и 300 столбцов. В совокупности в нашем изображении есть 400*300 = 120000 пикселей.
В большинстве изображений пиксели представлены двумя способами: в оттенках серого и в цветовом пространстве RGB. В изображениях в оттенках серого каждый пиксель имеет значение между 0 и 255, где 0 соответствует чёрному, а 255 соответствует белому. А значения между 0 и 255 принимают различные оттенки серого, где значения ближе к 0 более тёмные, а значения ближе к 255 более светлые:
Цветные пиксели обычно представлены в цветовом пространстве RGB(red, green, blue — красный, зелёный, синий), где одно значение для красной компоненты, одно для зелёной и одно для синей. Каждая из трёх компонент представлена целым числом в диапазоне от 0 до 255 включительно, которое указывает как «много» цвета содержится. Исходя из того, что каждая компонента представлена в диапазоне [0,255], то для того, чтобы представить насыщенность каждого цвета, нам будет достаточно 8-битного целого беззнакового числа. Затем мы объединяем значения всех трёх компонент в кортеж вида (красный, зеленый, синий). К примеру, чтобы получить белый цвет, каждая из компонент должна равняться 255: (255, 255, 255). Тогда, чтобы получить чёрный цвет, каждая из компонент должна быть равной 0: (0, 0, 0). Ниже приведены распространённые цвета, представленные в виде RGB кортежей:
Импорт библиотеки OpenCV
Теперь перейдём к практической части. Первое, что нам необходимо сделать — это импортировать библиотеку. Есть несколько путей импорта, самый распространённый — это использовать выражение:
import cv2
Также можно встретить следующую конструкцию для импорта данной библиотеки:
from cv2 import cv2
Загрузка, отображение и сохранение изображения
def loading_displaying_saving(): img = cv2.imread('girl.jpg', cv2.IMREAD_GRAYSCALE) cv2.imshow('girl', img) cv2.waitKey(0) cv2.imwrite('graygirl.jpg', img)
Для загрузки изображения мы используем функцию cv2.imread(), где первым аргументом указывается путь к изображению, а вторым аргументом, который является необязательным, мы указываем, в каком цветовом пространстве мы хотим считать наше изображение. Чтобы считать изображение в RGB — cv2.IMREAD_COLOR, в оттенках серого — cv2.IMREAD_GRAYSCALE. По умолчанию данный аргумент принимает значение cv2.IMREAD_COLOR. Данная функция возвращает 2D (для изображения в оттенках серого) либо 3D (для цветного изображения) массив NumPy. Форма массива для цветного изображения: высота x ширина x 3, где 3 — это байты, по одному байту на каждую из компонент. В изображениях в оттенках серого всё немного проще: высота x ширина.
С помощью функции cv2.imshow() мы отображаем изображение на нашем экране. В качестве первого аргумента мы передаём функции название нашего окна, а вторым аргументом изображение, которое мы загрузили с диска, однако, если мы далее не укажем функцию cv2.waitKey(), то изображение моментально закроется. Данная функция останавливает выполнение программы до нажатия клавиши, которую нужно передать первым аргументом. Для того, чтобы любая клавиша была засчитана передаётся 0. Слева представлено изображение в оттенках серого, а справа в формате RGB:
И, наконец, с помощью функции cv2.imwrite() записываем изображение в файл в формате jpg(данная библиотека поддерживает все популярные форматы изображений:png, tiff,jpeg,bmp и т. д., поэтому можно было сохранить наше изображение в любом из этих форматов), где первым аргументом передаётся непосредственно само название и расширение, а следующим параметром изображение, которое мы хотим сохранить.
Доступ к пикселям и манипулирование ими
Для того, чтобы узнать высоту, ширину и количество каналов у изображения можно использовать атрибут shape:
print("Высота:"+str(img.shape[0])) print("Ширина:" + str(img.shape[1])) print("Количество каналов:" + str(img.shape[2]))
Важно помнить, что у изображений в оттенках серого img.shape[2] будет недоступно, так как данные изображения представлены в виде 2D массива.
Чтобы получить доступ к значению пикселя, нам просто нужно указать координаты x и y пикселя, который нас интересует. Также важно помнить, что библиотека OpenCV хранит каналы формата RGB в обратном порядке, в то время как мы думаем в терминах красного, зеленого и синего, то OpenCV хранит их в порядке синего, зеленого и красного цветов:
(b, g, r) = img[0, 0] print("Красный: <>, Зелёный: <>, Синий: <>".format(r, g, b))
Cначала мы берём пиксель, который расположен в точке (0,0). Данный пиксель, да и любой другой пиксель, представлены в виде кортежа. Заметьте, что название переменных расположены в порядке b, g и r. В следующей строке выводим значение каждого канала на экран. Как можно увидеть, доступ к значениям пикселей довольно прост, также просто можно и манипулировать значениями пикселей:
img[0, 0] = (255, 0, 0) (b, g, r) = img[0, 0] print("Красный: <>, Зелёный: <>, Синий: <>".format(r, g, b))
В первой строке мы устанавливаем значение пикселя (0, 0) равным (255, 0, 0), затем мы снова берём значение данного пикселя и выводим его на экран, в результате мне на консоль вывелось следующее:
Красный: 251, Зелёный: 43, Синий: 65 Красный: 0, Зелёный: 0, Синий: 255
На этом у нас конец первой части. Если вдруг кому-то нужен исходный код и картинка, то вот ссылка на github. Всем спасибо за внимание!
Уроки OpenCV
Изучение Python OpenCV / Урок #1 – Нейронные сети и машинное обучение
Представляем вам курс по изучению Python библиотеки OpenCV. В ходе уроков для начинающих вы изучите построение программ на основе машинного обучения и нейронных сетей. К концу курса вы разработаете несколько проектов с нуля с использованием OpenCV и искусственного интеллекта.
Видеоурок
Полезные ссылки:
- Курс по языку Python ;
- Официальный сайт Python ;
- Программа PyCharm ;
- Программа Visual Studio Code .
С чем мы будем работать?
Существуют разные сферы применения искусственного интеллекта. Вы можете использовать нейронные сети для отслеживания голосовых команд, поиска информации, для создания роботов и так далее. Под каждую из таковых целей существует какая-то своя библиотека или же готовое решение.
Поскольку мы с вами в ходе курса будем работать с изображениями и видео, а также с отслеживанием объектов на всём этом, то нам наиболее подойдет библиотека OpenCV.
Что такое OpenCV?
Библиотека OpenCV расшифровывается как Open Source Computer Vision Library (библиотека с открытым исходным кодом для компьютерного зрения). Название говорит само за себя. Данная библиотека позволяет работать с изображениями и видео, распознавать на них объекты, информацию, текст и прочие моменты.
OpenCV реализована на основе языка C++ и была портирована для разработки на Python , Java , Ruby и некоторых других языков. Сама библиотека была разработана еще в 2006 году. С тех пор она перетерпела множество обновлений и на сегодня является лидером в сфере обработки фото и видео.
На что способна библиотека?
Представим вам нужно создать программу для паркинга в каком-либо торговом центре. Вам нужно отслеживать видео с камеры, обрабатывать его, находить номерные знаки и считывать с них информацию. Звучит сложно? Да, немного. Но при этом реализовать все это не будет столь большой проблемой, если использовать OpenCV.
В целом библиотека способна на любые действия, что как-либо связаны с фото или видео. Создать отслеживание и распознавание лиц, разработать проект для считывания текста, создать программу, что, наконец, поймет где кошка, а где собачка – все это и многое другое можно делать за счёт этой библиотеки.
В ходе курса мы изучим основной синтаксис библиотеки и разработаем проекты для распознавания лиц и считывания номерных знаков.
Почему именно язык Python?
На самом деле вы могли бы спокойно выбрать другой язык программирования. Тот же Джава вполне мог бы подойти. Мы выбрали Питон по причине его легкого синтаксиса и большого набора встроенных модулей. Дело в том, что нам не нужен сложный синтаксис, дабы мы не запутались. Сперва проще все изучить с использованием чего-то простого и удобного, а уже позже, по необходимости, вы сможете использовать OpenCV и для других языков программирования.
Все функции и вся суть библиотеки от этого никак не поменяется.
Другие библиотеки
OpenCV лидер в своем деле, но помимо него есть ещё сотни других. Про некоторые из них давайте поговорим.
За курс мы с вами будем работать с библиотекой « numpy ». В курсе нам потребуется обрабатывать огромные массивы данных. К примеру, чтобы понять что находится на фото его нужно будет привести в нужный формат и далее перебрать каждый пиксель. Для работы со столь большим набором данных можно использовать «numpy». Речь про эту библиотеку заходит практически каждый раз при разработке проектов с искусственным интеллектом. Библиотека содержит набор встроенных функций для быстрой обработки многомерных массивов данных.
В будущем вы можете столкнутся с такой библиотекой как « matplotlib ». Сама по себе она не работает с нейронными сетями, но зато прекрасно справляется с обработкой больших наборов данных и их визуализацией. Если в будущем вам понадобится вывести их пользователю, то это можно будет быстро сделать за счет этой библиотеки. Она обладает набором функций для визуализации данных и создания различных графиков, диаграмм и прочих интерактивных схем.
Библиотека « tensorflow » является хардкорным решением, ведь она позволяет практически с нуля разработать нейронную сеть под ваши нужды. Библиотека очень крутая и мощная, но к ней стоит подходить не сразу, иначе можно быстро утратить весь интерес среди множества чисел и данных.
План курса
В ходе курса мы с вами будем рассматривать все основные тонкости библиотеки OpenCV. Мы научимся открывать фото и видео, обрабатывать их, добавлять к ним эффекты, а также выполнять различные трансформации с ними. После изучение основных концепций мы приступим к разработке полноценных проектов. Нами будет создано приложение по распознаванию лиц на фото и будет разработана программа для отслеживания номерных знаков и чтения текста с них.
Перед курсом мы настоятельно рекомендуем изучить язык Питон. Без понимания данного языка вам будет сложно пройти данный курс и изучить OpenCV. Большая программа обучения по данному языку программирования есть на нашем сайте. Вы можете ознакомиться с этой программой здесь .
Большое задание по курсу
Вам необходимо оформить подписку на сайте, чтобы иметь доступ ко всем большим заданиям. В задание входит методика решения, а также готовый проект с ответом к заданию.
PS: подобные задания доступны при подписке от 1 месяца
Введение в OpenCV — библиотеку компьютерного зрения на Python
В этом руководстве мы изучим, как использовать библиотеку OpenCV в Python.
OpenCV — это библиотека с открытым кодом, поддерживающая множество платформ, включая Windows, MacOs и Linux. Также эта библиотека существует и для многих языков программирования. Но наиболее часто она используется для написания приложений машинного обучения на языке Python, особенно в сфере компьютерного зрения.
Помимо кроссплатформенности и поддержки многих языков программирования, которые позволяют использовать приложения на различных системах, библиотека OpenCV весьма эффективна (по сравнению с другими похожими библиотеками) с точки зрения вычислений, так как почти все функции и операторы в ней векторизированны.
В этой статье мы научим вас устанавливать библиотеку OpenСV на платформы Windows, MacOS и Linux. Также мы расскажем про операции с изображениями, арифметику изображений, сглаживание изображений и геометрические трансформации изображений при помощи библиотеки OpenCV. Приступим!
Установка библиотеки
Замечание: так как мы рассматриваем использование библиотеки OpenСV для языка Python, то неявно подразумевается, что сам Python ( версии 3) у вас уже установлен. Для установки библиотеки OpenCV выполните одну из следующих команд, в зависимости от вашей операционной системы.
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 для дальнейшей работы.
Замечание: если в результате выполнения данного кода возникла ошибка, есть только три возможных причины для этого. Первая — вы неправильно задали путь к файлу. Вторая — такого файла просто не существует, и третья — тип изображения (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. Как вы будете действовать?
Мы начнем с крайнего левого угла нашего изображения, поместим туда фильтр размером 3Х3 и заменим центральный элемент на среднее по всем девяти элементам (сумма элементов, попавших в фильтр, деленная на 9). Это будет только первым этапом. Далее мы сдвинем фильтр на один шаг вправо и повторим эту процедуру. Ниже этот пример наглядно проиллюстрирован.
Фильтр или маска:
Применение фильтра к изображению размером 10Х10:
Давайте теперь посмотрим, как можно организовать фильтрацию изображения при помощи библиотеки OpenCV. Пожалуйста, внимательно прочитайте все комментарии к каждой строчке данного кода.
import cv2 # Загрузка первоначального изображения original_image = cv2.imread('my_bike.png') # Фильтрация изображения усредняющим фильтром 3Х3 average_image = cv2.blur(original_image,(3,3)) # Применение фильтра Гаусса к первоначальному изображению gaussian_image = cv2.GaussianBlur((original_image,(3,3),0)) # Применение медианного фильтра к первоначальному изображению median_image = cv2.medianBlur(original_image,3)
Чтобы увидеть результат на экране, выполните следующий вспомогательный код:
import matplotlib.pyplot as plt plt.imshow(average_image) plt.show()
Преобразование изображений
Последней, но одной из самых важных тем, поднятых нами в данном обзоре библиотеки OpenCV, является преобразование изображений. Эта тема находит применение в самых разных приложениях, но отдельно следует упомянуть задачу аугментации данных для моделей машинного обучения. Речь идет о ситуациях, когда в нашем датасете для полноценного обучения недостаточно данных, и мы, дополняя и видоизменяя существующие картинки, увеличиваем первоначальный датасет до нужного размера. Это помогает нам серьезно увеличить точность работы обучаемой модели.
Список возможных преобразований весьма велик и включает в себя масштабирование, афинное преобразование изображений, вращение, транспонирование и многое другое. Мы кратко расскажем только про масштабирование и вращение, но в библиотеке OpenСV есть поддержка всех возможных преобразований. Начнем с масштабирования.
Масштабирование
Попросту говоря, масштабирование — это не что иное как изменение размеров изображения, его увеличение либо уменьшение. В библиотеке OpenCV для этого существует функция resize. У этой функции, в свою очередь, есть три метода: INTER_CUBIC , INTER_LINEAR и INTER_AREA . Давайте на примере конкретного кода разберем, как это все работает. Пожалуйста, внимательно изучите код, комментарии к нему и описание ниже.
import cv2 import numpy as np import matplotlib.pyplot as plt image = cv2.imread('my_bike.jpg') # Увеличиваем масштаб/расширяем в 2 раза по ширине и высоте result_1 = cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC) # Уменьшаем масштаб/сжимаем в 2 раза по ширине и высоте result_2 = cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_AREA) # Выводим на экран получившиеся изображения plt.imshow(result_1) plt.imshow(result_2) plt.show()
Здесь в функции resize параметр fx определяет масштаб изменений по ширине, fy — по высоте, а параметр interpolation отвечает за сам способ изменений (то есть расширение или сжатие).
Вращение
Вращение позволяет нам перемещать изображение вокруг определенной оси на заданный угол.
Перед тем как мы научимся вращать наши изображения при помощи библиотеки OpenСV, давайте вспомним, что существует линейный оператор под названием матрица поворота, который как раз и осуществляет преобразования такого рода. Мы не будем вдаваться в математические детали, так как в библиотеке OpenCV эта матрица вычисляется при помощи одного вызова функции. Вы это увидите в следующем коде:
import cv2 import matplotlib.pyplot as plt # Загружаем изображение велосипеда image = cv2.imread('my_bike.jpg',0) # ряды и колонки r, c = image.shape matrix = cv2.getRotationMatrix2D((cols/2,rows/2), 180, 1) result = cv2.warpAffine(image,matrix,(c,r)) # Выводим на экран повернутое изображение plt.imshow(result) plt.show()
В функции getRotationMatrix2D 180 — это угол, на который наше изображение должно быть повернуто, 1 — это масштабный коэффициент. Данная функция возвращает матрицу поворота, которая записывается в переменную matrix .
Далее функция warpAffine , используя вычисленную на предыдущем шаге матрицу поворота, поворачивает наше изображение в соответствии с заданной спецификацией.
Выводы
Подводя итоги, давайте еще раз пройдемся по наиболее важным местам в нашей статье. Библиотека OpenCV доступна на многих языках и часто используется вместе с библиотеками NumPy, SciPy и Matplotlib, как мы могли заметить в приведенных примерах. Некоторые функции библиотеки взяты из Matlab и также поддерживают векторные вычисления, что сильно повышает вычислительную эффективность.
Кроме того, OpenCV является одной из лучших библиотек для компьютерного зрения, и после прочтения этой статьи вы сможете найти много приложений машинного обучения, которые были разработаны с использованием OpenCV.
Также надо сказать, что данная статья приоткрывает лишь самую малость того, что есть в библиотеке OpenСV. Ее прочтение должно вдохновить вас еще глубже погрузиться в изучение этой библиотеки и узнать о многих других продвинутых функциях в ней.