Рубрики
Без рубрики

Введение в OpenCV с Python

Автор оригинала: 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-это двухэтапный процесс; сначала мы должны загрузить его, а затем мы можем его отобразить. Обе операции выполняются последовательно с использованием различных функций.

Чтобы отобразить изображение, нам нужно знать две вещи:

  1. Путь изображения (работают как абсолютные, так и относительные пути)
  2. Режим чтения (чтение, запись и т. Д.)

Функция , которую мы будем использовать для чтения/загрузки изображения, – это 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.