RUDE

Основы OpenCV в Python

CoderStudio, 15.05.2022 18:19
Основы OpenCV в Python

От установки до базовых манипуляций с изображениями

OpenCV - это популярная библиотека компьютерного зрения с открытым исходным кодом, доступная для различных языков программирования, таких как Python, C++ и JavaScript. Она предоставляет богатый набор инструментов для обработки и анализа изображений и видео, позволяя вам от изменения размера одной фотографии до создания сложного приложения для распознавания объектов. Язык программирования Python, помимо того, что он был широко принят в качестве стандарта для большинства приложений обработки изображений и компьютерного зрения, позволяет установить OpenCV на ваш компьютер очень простым способом.

В этом руководстве я покажу вам шаги, необходимые для установки, настройки и выполнения некоторых базовых манипуляций с изображениями с помощью OpenCV, освещая важные основы концепции, лежащей в основе этой библиотеки.

Прежде чем мы начнем, стоит упомянуть, что эти шаги были выполнены с использованием Python3 в операционной системе на базе Linux. Поэтому, если вы используете другую конфигурацию, могут потребоваться незначительные изменения.

Настройка виртуальной среды

При работе с Python часто рекомендуется запускать приложения в виртуальной среде. Таким образом, вы можете установить только те пакеты, которые необходимы для работы вашего приложения, сделав его независимым от остальной системы. Если на вашем компьютере до сих пор не установлен инструмент виртуальной среды, я рекомендую вам установить следующее.

 python3 -m pip install virtualenv

После установки вы можете использовать этот инструмент для создания нового виртуального окружения. Для этого перейдите в нужную директорию и выполните следующую команду.

python3 -m venv <имя вашей виртуальной среды>

Наконец, вам нужно активировать виртуальную среду, чтобы все, что вы запускаете в этом терминале, выполнялось в ней.

source venv/bin/activate

Установка OpenCV

Начните с обновления менеджера пакетов и установки OpenCV для Python3.

sudo apt
updatesudo apt install python3-opencv

Затем установите OpenCV в вашей виртуальной среде с помощью pip.

pip install opencv-python

Открытие изображения

Используя вашу любимую IDE, создайте новый файл с расширением .py и начните с импорта класса OpenCV.

import cv2

Первое, что мы сделаем, это откроем изображение с помощью метода imread(). Пожалуйста, замените путь ниже на путь, где находится ваше изображение.

image = cv2.imread("images/messi.jpg
")
cv2.imshow("Original image", image)
Оригинальное изображение
Оригинальное изображение

Первый интересный момент в том, как OpenCV интерпретирует изображения, заключается в том, что imread() возвращает объект n-мерного массива. В случае RGB-изображения, такого как использованное в данном примере, этот массив имеет вид:

[ширина × высота × количество каналов].

Вы можете убедиться в этом, распечатав форму изображения.

print("Форма исходного изображения:", image.shape)

Изменение цветового пространства изображения

Цветовое пространство - это диапазон цветов в спектре, который используется для описания изображения. Хотя существует несколько цветовых пространств, наиболее распространенными являются RGB и градации серого. OpenCV содержит определенный метод преобразования цветового пространства. Чтобы преобразовать изображение из RGB в градации серого, необходимо применить метод cvtColor().

image_grayscale = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow("Grayscale image", image_grayscale)
Изображение в градациях серого
Изображение в градациях серого

Важно отметить, что теперь ваше изображение больше не содержит трех измерений. Это связано с тем, что третье измерение, соответствующее каналам, не используется в серошкальном цветовом пространстве.

print("Форма полутонового изображения:", image_grayscale.shape)

Редактирование каналов изображения

Вернувшись к исходному изображению, содержащему три цветовых канала, вы можете манипулировать значениями интенсивности каждого из них, чтобы подавить или выделить определенный канал. Вопреки обычному мнению, доступ к каналам RGB осуществляется не в том же порядке, что и в аббревиатуре. В OpenCV каналы доступны в следующем порядке:

0 = B (синий)

1 = G (зеленый)

2 = R (красный)

В приведенном ниже примере я извлекаю все пиксели первых двух каналов и делаю их нулевыми, чтобы зеленый и синий каналы не оказывали никакого влияния на результирующее изображение, которое, соответственно, будет иметь исключительно красный тон.

image_red = image.copy()
image_red[:, :, :2] = 0
cv2.imshow("Красное изображение", image_red)
Изображение с нулевыми синим и зеленым каналами
Изображение с нулевыми синим и зеленым каналами

При печати формы красного изображения обратите внимание, что третье измерение все еще присутствует, иначе полученное изображение можно было бы назвать градацией серого.

print("Форма красного изображения:", image_red.shape)

Поворот изображения

Помимо цветов, можно также выполнять манипуляции с формой изображения, например, изменять размер и ориентацию. Вы можете начать с получения размеров изображения, как это делается в обычном объекте NumPy.

width, height, _ = image.shape

Затем можно вычислить центральные точки изображения, взяв половину его ширины и высоты.

center = (width//2, height//2)

Чтобы повернуть изображение, сначала нужно создать матрицу вращения, передав в качестве аргументов центральные точки, желаемый поворот в градусах и масштаб изображения соответственно. Использование масштаба, отличного от 1, изменит размер изображения.

rotation_matrix = cv2.getRotationMatrix2D(center, 45, 1.0) 

Самого объекта матрицы вращения недостаточно, чтобы сделать то, что мы хотим. Он передается в качестве аргумента в метод warpAffine(), который, собственно, и выполняет вращение.

image_rotated = cv2.warpAffine(image, rotation_matrix, (width, height)
)cv2.imshow("Rotated image", image_rotated)
Повернутое изображение
Повернутое изображение

Изменение размера изображения

Вы можете использовать полученные ранее значения высоты и ширины для определения новых размеров изображения. В приведенном ниже примере я задал их так, чтобы уменьшить изображение до трети его исходного размера.

new_size = (width//3, height//3)

За изменение размера изображения отвечает метод resize(), которому в качестве аргументов нужны исходный объект изображения, желаемый новый размер и метод интерполяции соответственно.

image_resized = cv2.resize(image, new_size, interpolation=cv2.INTER_LINEAR
)
cv2.imshow("Resized image", image_resized)
Измененное изображение
Измененное изображение

Затем вы можете проверить размеры измененного изображения.

print("Форма измененного изображения:", image_resized.shape)

Вставка рисунков в изображение

В некоторых приложениях может потребоваться добавить маркеры на изображение. Класс OpenCV предоставляет несколько методов для рисования на нем линий и фигур. Линия добавляется следующим образом. Аргументами здесь являются исходное изображение, начальная позиция, конечная позиция, RGB-код цвета линии и ширина линии. Обратите внимание, что фактически используется копия исходного изображения, так как методы рисования могут повлиять на исходное изображение.

image_line = cv2.line(image.copy(), (0, 0), (height//2, width//2), (0, 255, 255), 10
)
cv2.imshow("Изображение с линией", image_line)
Изображение с линией
Изображение с линией

Аналогичным образом существует специальный метод для рисования прямоугольников на изображении. В этом случае второй и третий аргументы являются позициями крайних вершин прямоугольника.

image_rectangle = cv2.rectangle(image.copy(), (500, 150), (900, 550), (0, 255, 255), 5
)
cv2.imshow("Изображение с прямоугольником", image_rectangle)
Изображение с прямоугольником
Изображение с прямоугольником

Вы также можете нарисовать круг, указав положение его центра и радиус в качестве второго и третьего аргументов соответственно.

image_circle = cv2.circle(image.copy(), (300, 300), 200, (0, 255, 255), 5
)
cv2.imshow("Изображение с кругом", image_circle)
Изображение с кругом
Изображение с кругом

Полный сценарий

Сценарий, созданный в этой статье, доступен по адресу:

https://github.com/lfgodoi/tutorials/tree/main/fundamentals-of-opencv-in-python

В завершение

В заключение я хотел бы привести ссылки на интересные материалы для тех, кто хочет углубиться в компьютерное зрение с помощью OpenCV.

Официальный сайт OpenCV:

https://opencv.org/