Автор оригинала: Muhammad Junaid Khalid.
Вступление
В этом уроке мы узнаем, как использовать библиотеку OpenCV в Python. OpenCV-это библиотека с открытым исходным кодом, которая поддерживается несколькими платформами, включая Windows, Linux и macOS, а также доступна для использования на нескольких других языках; однако чаще всего она используется в Python для приложений машинного обучения, особенно в области компьютерного зрения.
Помимо кросс-платформенной поддержки и доступности на множестве других компьютерных языков, что позволяет использовать разработанные на нем приложения в различных системах, OpenCV также, по сравнению с другими подобными библиотеками, довольно эффективен с точки зрения вычислений, поскольку использует векторные операции для большинства своих функций.
В этом уроке мы рассмотрим установку OpenCV на Mac, Windows и Linux, операции с изображениями, арифметику изображений, сглаживание изображений и геометрические преобразования с использованием OpenCV. Итак, без лишних слов, давайте начнем.
Установка
Примечание : Поскольку мы собираемся использовать OpenCV на языке Python, это неявное требование, чтобы у вас уже был установлен Python (версия 3) на вашей рабочей станции. В зависимости от вашей операционной системы выполните одну из следующих команд, чтобы установить библиотеку OpenCV в вашей системе:
Окна
$ pip install opencv-python
macOS
$ brew install opencv3 --with-contrib --with-python3
Линукс
$ sudo apt-get install libopencv-dev python-opencv
Чтобы проверить, была ли ваша установка успешной или нет, выполните следующую команду либо в оболочке Python, либо в командной строке/терминале:
import cv2
Если вы не получили ошибку при импорте cv2
, значит, он был установлен правильно.
Основные Операции С Изображениями
Теперь, когда мы установили OpenCV на наших рабочих станциях, давайте запачкаем руки некоторыми функциями, которые предлагает OpenCV.
Отображение изображения
Отображение изображения с помощью OpenCV-это двухэтапный процесс; сначала мы должны загрузить его, а затем мы можем его отобразить. Обе операции выполняются последовательно с использованием различных функций.
Чтобы отобразить изображение, нам нужно знать две вещи:
- Путь изображения (работают как абсолютные, так и относительные пути)
- Режим чтения (чтение, запись и т. Д.)
Функция , которую мы будем использовать для чтения/загрузки изображения, – это cv2.imread ()
, которая имеет два варианта. Первый-это IMREAD_GRAYSCALE
, который, как следует из названия, преобразует изображение в оттенки серого перед его чтением. Второй – IMREAD_UNCHANGED
, который загружает изображение без вырезания альфа-канала. По умолчанию используется IMREAD_COLOR
, который просто считывает цветное изображение, используя только каналы RGB.
Давайте закодируем пример:
import cv2 my_bike = cv2.imread('bike.png')
Это загрузит образ велосипеда из файловой системы и сохранит его в переменной my_bike
для дальнейших операций
Примечание : Если вы получаете ошибку из приведенного выше кода, то для этого есть только три возможные причины. Первый из них заключается в том, что указанный вами путь неверен, второй-в том, что указанный вами файл изображения не существует, а последний-в том, что тип изображения (jpg/jpeg/png) в пути изображения неверен.
Давайте теперь покажем изображение, которое мы только что прочитали. Это можно сделать с помощью функции cv2.imshow ()
. Если вы использовали Matlab, вы можете быть знакомы с этими операциями с изображениями.
cv2.imshow('my_bike', my_bike)
Первый параметр функции imshow ()
– это строковое имя, которое вы хотите отобразить в окне изображения. Второй параметр-это обработчик изображений, созданный с помощью функции cv2.imread ()
.
Сохранение изображения
Сохранение изображения-это очень часто используемая функция, так как нам может потребоваться обновить наш образ и сохранить изменения в файловой системе для последующего использования. OpenCV имеет функцию cv2.imwrite()
для сохранения изображений.
Вот пример:
cv2.imwrite('bike.png', my_bike)
Здесь мы указываем имя и текущее местоположение изображения. Полученное изображение автоматически сохраняется в текущем рабочем каталоге.
Арифметические операции над изображениями
Арифметические операции над изображениями относятся к сложению, вычитанию, умножению или делению нескольких изображений для создания нового изображения, представляющего собой арифметическую комбинацию входных изображений. Арифметика изображений имеет множество приложений, таких как добавление водяного знака к изображению, создание смешанной комбинации из двух изображений, применение различных типов фильтров изображений и т. Д.
Хотя есть много операций, которые вы можете выполнить, мы покажем здесь только два примера, так как это позволит вам применить эту концепцию к другим арифметическим операциям, доступным в OpenCV. Первым примером будет добавление двух изображений, а вторым – смешивание двух изображений.
Давайте закодируем эти два примера:
Добавление изображений
import cv2 # Read in the two images image_1 = cv2.imread('bike.jpg') image_2 = cv2.imread('car.jpg') # Sum the two image arrays for all channels result = cv2.add(image_1, image_2) cv2.imshow('result', result) cv2.waitKey(0) cv2.destroyAllWindows()
Команда waitKey
будет ждать, пока вы нажмете клавишу, прежде чем перейти к следующей команде. Это полезно для того, чтобы программа продолжала отображать ваше изображение до тех пор, пока не будет нажата клавиша, в противном случае оно будет отображаться в течение доли секунды, а затем быстро исчезнет, как только программа прекратит выполнение.
Смешивание изображений
Смешивание изображений аналогично добавлению изображений, за исключением того, что вклад каждого изображения в новое результирующее изображение можно контролировать. В принципе, если мы хотим, чтобы одно изображение было более сфокусированным, а другое-более слабым, когда они сливаются, мы будем использовать смешивание, а не простое сложение.
Давайте закодируем его для дальнейшего уточнения:
import cv2 # Read in the two images 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) # Wait for the user to press a key before continuing cv2.destroyAllWindows()
Сумма весов, заданных функции addWeighted
, должна быть равна 1,0. Вы также можете дать скалярное значение в конце, которое будет добавлено ко всем значениям пикселей результирующего изображения.
Примечание : Изображения могут быть любого типа; однако тип должен быть одинаковым для всех изображений. Например, если вы используете формат PNG, все изображения, используемые для вычислений, также должны быть в формате PNG.
Сглаживание изображения
Сглаживание изображений-очень полезная функция, которая в основном выполняется перед передачей изображений в модель машинного обучения. В основном это делается для удаления шумовых/высокочастотных элементов из изображений путем пропускания изображения через фильтр нижних частот. Существует множество фильтров, включая box filter (фильтр усреднения), median filter, mode filter, Gaussian filter и многие другие; однако, чтобы понять сглаживание изображения и как это сделать с помощью OpenCV, мы рассмотрим только box filter.
Допустим, у вас есть изображение 10×10, и вы хотите пропустить его через фильтр 3×3 box/averaging, как бы вы это сделали?
Вы начнете с верхнего левого края изображения, поместите туда свой фильтр 3х3 и замените центральный элемент средним из всех 9 элементов. Это был первый шаг, теперь вы переместите фильтр на один шаг вправо и повторите тот же процесс, пока не охватите все изображение. Пример изображения 10×10 и усредняющего фильтра 3×3 показан ниже для вашей справки:
Фильтр/Маска:
Фильтр, применяемый к изображению 10×10:
Теперь, когда мы обсудили, как это работает, давайте попробуем посмотреть, как мы можем применять различные фильтры к нашему изображению с помощью OpenCV; пожалуйста, внимательно прочитайте комментарии, чтобы узнать, какая строка кода используется для какого фильтра:
import cv2 # Load the original image original_image = cv2.imread('my_bike.png') # Filter by passing image through 3x3 averaging filter average_image = cv2.blur(original_image,(3,3)) # Apply 3x3 gaussian filter on the original image gaussian_image = cv2.GaussianBlur((original_image,(3,3),0)) # Apply 3x3 median filter on the original image median_image = cv2.medianBlur(original_image,3)
Примечание : Вы можете просмотреть полученные изображения, используя следующий дополнительный код:
import matplotlib.pyplot as plt plt.imshow(average_image) plt.show()
Преобразования изображений
Преобразование изображений-это последняя, но одна из самых важных тем, которую мы собираемся осветить с помощью OpenCV. У него есть много приложений, но одно из самых распространенных в настоящее время-это Машинное обучение для увеличения данных, то есть когда у вас есть нехватка набора данных, вы увеличиваете/преобразуете доступные в настоящее время изображения, чтобы сделать их отличными от вашего существующего набора данных. Это эффективно увеличивает размер набора данных и может помочь повысить точность модели.
Список возможных преобразований очень длинный, включая масштабирование, аффинное преобразование , вращение, перевод и т. Д. Мы рассмотрим только два из них, используя OpenCV, чтобы получить общее представление; однако OpenCV предоставляет вспомогательные функции для широкого спектра из них. Начнем с масштабирования.
Пересчет
Проще говоря, масштабирование-это в основном просто изменение размера вашего изображения, то есть либо увеличение, либо уменьшение. resize
– это функция, используемая для масштабирования изображений в OpenCV. Изменение размера имеет три типа: INTER_CUBIC
, INTER_LINEAR
и INTER_AREA
. Давайте закодируем пример использования этих функций для масштабирования; пожалуйста, внимательно прочтите код, комментарии и описания, поскольку они объяснят, что именно происходит в коде:
import cv2 import numpy as np import matplotlib.pyplot as plt image = cv2.imread('my_bike.jpg') # Scale up/expand both width and height by factor of 2 result_1 = cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC) # Scale down/shrink both width and height by factor of 2 result_2 = cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_AREA) # Display the resulting images plt.imshow(result_1) plt.imshow(result_2) plt.show()
Здесь в функции resize
параметр fx
in представляет масштабный коэффициент для ширины, fy
представляет масштабный коэффициент высоты, а интерполяция
указывает функцию, которая будет использоваться для масштабирования (сжатия или расширения).
Вращение
Вращение позволяет перемещать изображение вокруг оси на определенный заданный угол.
Прежде чем мы научимся вращать наши изображения с помощью кода, мы должны знать, что существует матрица вращения , которая используется для выполнения этого преобразования; мы не будем вдаваться в подробности этого, так как OpenCV очень просто вычисляет эту матрицу с помощью одного вызова функции. Вы увидите это в приведенном ниже коде:
import cv2 import matplotlib.pyplot as plt # Load the image of a bike image = cv2.imread('my_bike.jpg',0) # Rows and columns r, c = image.shape matrix = cv2.getRotationMatrix2D((cols/2,rows/2), 180, 1) result = cv2.warpAffine(image,matrix,(c,r)) # Display resulting rotation plt.imshow(result) plt.show()
В функции getRotationMatrix2D
180 указывает степень поворота изображения, 1-коэффициент масштабирования, вызов функции вернет матрицу поворота в переменной matrix
.
Вызов функции warpAffine
использует матрицу, которую мы рассчитали из предыдущего метода, чтобы повернуть изображение в соответствии с нашими спецификациями.
Вывод
Чтобы завершить все это, давайте повторим некоторые важные моменты, которые мы обсуждали в этой статье. OpenCV-это библиотека , доступная на нескольких языках и в основном используемая в сочетании с NumPy , SciPy и Matplotlib, как мы видели в некоторых примерах выше. Некоторые из его функций такие же, как и в Matlab, и он также поддерживает векторизованные операции, что повышает эффективность вычислений.
Кроме того, OpenCV является одной из лучших библиотек для области компьютерного зрения, и после прочтения этой статьи вы сможете продолжить поиск некоторых приложений компьютерного зрения/машинного обучения, которые были разработаны с использованием OpenCV.
Пусть будет известно, что эта статья была лишь верхушкой айсберга, и OpenCV может предложить гораздо больше. Прочитав это, вы сможете погрузиться глубже и узнать о других расширенных функциях, которые может предложить OpenCV.