Библиотека OpenCV в Python — это открытая библиотека компьютерного зрения, предназначенная для анализа, классификации и обработки изображений.
Введение
OpenCV является библиотекой с открытым кодом, которая поддерживает большое количество платформ, в том числе Windows, MacOs и Linux. Следует отметить, что данная библиотека поддерживает также многие языки программирования, однако чаще всего она применяется для написания приложений машинного обучения на языке Python, в частности сфере компьютерного зрения.
Кроме кроссплатформенности и поддержки большого числа языков программирования, что позволяет осуществлять использование приложения на разных системах, библиотека OpenCV является очень эффективной (в сравнении с другими аналогичными библиотеками) с позиции вычислительных операций, поскольку практически все функции и операторы в ней могут работать в векторном формате.
Библиотека OpenCV в Python
Для того чтобы установить библиотеку OpenCV, следует выполнить одну из специальных команд, формат которой определяется типом операционной системы. Для операционной системы Windows нужно использовать следующую команду:
$ pip install opencv-python pip install opencv-python
Для операционной системы MacOS команда имеет следующий вид:
$ brew install opencv3 --with-contrib --with-python3 brew install opencv3 --with-contrib --with-python3
Для операционной системы Linux используется следующая команда:
$ sudo apt-get install libopencv-dev python-opencv sudo apt-get install libopencv-dev python-opencv
Для того чтобы проверить результат установки библиотеки, следует просто ввести в терминале Python следующую команду:
import cv2
В случае отсутствия сообщения об ошибке, можно сделать вывод, что импорт библиотеки прошел успешно.
Операция вывода изображения на экран осуществляется исполнением следующих шагов:
- Осуществление загрузки изображения.
- Осуществление вывода изображения на дисплей.
Данные процедуры должны исполняться поочередно, и для каждой из них имеется своя отдельная функция. Для того чтобы вывести изображение на экран требуется определить следующие моменты:
- Указать путь к файлу, который содержит изображение (может использоваться как относительная, так и абсолютная адресация).
- Задать режим чтения файла, то есть, разрешено лишь чтение, запись, и так далее.
Функция, с помощью которой может считываться изображение, обозначается как 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, эта функция безусловно знакома:
cv2.ímshow('my_bíke', my_bíke)
Здесь первым параметром функции imshow() является строка, которая будет использована как заголовок к данному изображению. А вторым параметром является переменная, которая содержит загруженное ранее изображение.
Для того чтобы сохранить результаты проделанной работы с изображением в библиотеке OpenCV присутствует функция cv2.ímwrite(). Приведем пример ее использования:
cv2.ímwrite('bíke.png', my_bíke)
В этом примере было задано название файла и переменной, в которой находится изображение. Это изображение сохранится в текущей рабочей директории.
Арифметические действия над изображениями включают в свой состав операции сложения, вычитания, деления и умножения разных изображений и применяются для формирования новых изображений при помощи арифметических операций над исходными изображениями. Арифметические операции над изображениями обладают множеством вариантов практического использования. Это может быть нанесение водяного знака на картинку, смешивание пары изображений, использование к изображениям разных фильтров и тому подобное.
Из всего большого набора допустимых операций следует особо выделить сложение двух изображений и их смешивание, которые ясно демонстрируют концепцию арифметических операций в библиотеке OpenСV. Рассмотрим пример сложения изображений:
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(), должно быть равно единице. Помимо этого, в финале в функцию может быть передана скалярная величина, которая может добавляться к значению каждого пикселя итогового изображения.