Начало работы с OpenCV в Python: основы обработки изображений

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

Что такое OpenCV?

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

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

# Import necessary libraries
import cv2                 
import numpy as np              
from dataPath import DATA_PATH  # dataPath module for data path to the images
import matplotlib.pyplot as plt         
%matplotlib inline                    

Чтение и отображение изображений

Первым шагом в обработке изображений является чтение изображения. OpenCV позволяет читать различные типы изображений (JPG, PNG и т. д.). Мы можем загружать изображения в градациях серого, цветные изображения или вы также можете загружать изображения с альфа-каналом. OpenCV использует функцию cv2.imread() для чтения изображения. Функция cv2.imread() принимает путь к файлу изображения в качестве аргумента и возвращает данные изображения в виде массива NumPy, потому что в python цифровое изображение представляет собой массив NumPy.

imagePath = DATA_PATH + "/images/number_zero.jpg"

# Read image in Grayscale format
img = cv2.imread(imagePath,cv2.IMREAD_GRAYSCALE)  

print("Image Dimensions = {}\n".format(img.shape))
print(img)

Мы печатаем двумерный массив, чтобы увидеть, что представляет собой изображение. Мы можем понять, что изображение означает «0». Всякий раз, когда используется cv2.imread(), переменная (img) будет массивом NumPy, показывающим значение интенсивности для каждого пикселя. Значения пикселей варьируются от 0 (полностью черный) до 255 (полностью белый).

Мы можем отобразить изображение с помощью функции imshow(). Функция cv2.imshow() принимает в качестве аргументов имя окна и данные изображения.

cv2.imshow('Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

plt.imshow(testImage)  # matplotlib function

Кроме того, важно пройтись по цветным изображениям, потому что это открывает новое измерение обработки каналов. Цветные изображения имеют 3 измерения, где 3-е измерение указывает количество каналов, которые имеет изображение. Для изображения JPEG его простое красно-зелено-синее (RGB) изображение составляет 3 канала, однако изображение PNG имеет дополнительный «альфа-канал» в дополнение к RGB.

В OpenCV порядок каналов R, G и B обратный. т. е. в матрице изображения сначала индексируется синий канал, затем зеленый канал и, наконец, красный канал. Я использую «matplotlib» для отображения изображения, и для правильного отображения изображения важно преобразовать цветовое пространство BGR в цветовое пространство RGB с помощью функции cv2.cvtColor().

imagePath = DATA_PATH + "/images/musk.jpg"

# Read the image
img = cv2.imread(imagePath)
print("image Dimension ={}".format(img.shape))

# Convert BGR to RGB colorspace
imgRGB = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
plt.imshow(imgRGB)       # matplotlib function 

Основные операции с изображениями

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

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

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

Давайте рассмотрим пример выполнения некоторых из этих операций в Python с помощью OpenCV. Начнем с импорта необходимых библиотек:

import cv2
import numpy as np

Для выполнения операций на уровне пикселей мы можем использовать встроенные функции, предоставляемые OpenCV. Например, для выполнения арифметических операций с изображениями мы можем использовать функцию cv2.add(). Функция cv2.add() используется для добавления двух изображений или скалярных значений. Когда мы используем функцию cv2.add() для добавления двух изображений, значения пикселей изображений складываются вместе. Однако важно отметить, что результирующие значения пикселей могут превышать максимальное значение пикселей, которое может быть представлено типом данных входных изображений. В таких случаях результирующее значение пикселя усекается до максимального значения, которое может быть представлено.

img1 = cv2.imread('image1.jpg', 0)  # Load the first grayscale image
img2 = cv2.imread('image2.jpg', 0)  # Load the second grayscale image

img3 = cv2.add(img1, img2)  # Add the two images

В этом случае значения пикселей img1 и img2 складываются вместе для формирования значений пикселей img3. Если результирующие значения пикселей img3 превышают 255 (это максимальное значение пикселей, которое может быть представлено 8-битным изображением в градациях серого), значения усекаются до 255.

Для выполнения геометрических операций мы можем использовать встроенные функции, предоставляемые OpenCV. Например, чтобы повернуть изображение, мы можем использовать функцию cv2.rotate():

import cv2

# Load the image
img = cv2.imread('image.jpg')

# Rotate the image by 45 degrees
rotated_img = cv2.rotate(img, cv2.cv2.ROTATE_45_CLOCKWISE)

# Display the original and rotated images
cv2.imshow('Original Image', img)
cv2.imshow('Rotated Image', rotated_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Функция cv2.rotate() в OpenCV используется для поворота изображения на заданный угол. Когда вы применяете функцию cv2.rotate() к изображению, пиксели изображения преобразуются путем их поворота по часовой стрелке или против часовой стрелки, в зависимости от заданного угла.

Функция принимает два аргумента: входное изображение и угол поворота в градусах. Если угол положительный, изображение поворачивается по часовой стрелке, а если угол отрицательный, изображение поворачивается против часовой стрелки.

Когда функция cv2.rotate() применяется к изображению, размер изображения может меняться в зависимости от угла поворота. Как правило, размер выходного изображения будет больше, чем исходное изображение, поскольку повернутое изображение должно содержать все пиксели исходного изображения.

Функция использует процесс, называемый аффинным преобразованием, который включает матричное умножение для поворота пикселей изображения. Матрица преобразования, используемая функцией, создается с помощью функции cv2.getRotationmatrix2D().

Чтобы масштабировать изображение, мы можем использовать функцию cv2.resize(). Мы можем получить вывод двумя способами: либо явно указав ширину и высоту выходного изображения, либо указав коэффициент масштабирования. Дальнейшая интерполяция должна быть явно упомянута, так как она измеряет качество и стоимость вычислений вывода. Всегда есть компромисс между скоростью и качеством результатов.

image = cv2.imread(DATA_PATH+"images/boy.jpg")

# Set rows and columns
resizeDownWidth = 300
resizeDownHeight = 200
resizedDown = cv2.resize(image, (resizeDownWidth, resizeDownHeight), interpolation= cv2.INTER_LINEAR)

# Mess up with the aspect ratio
resizeUpWidth = 600
resizeUpHeight = 900
resizedUp = cv2.resize(image, (resizeUpWidth, resizeUpHeight), interpolation= cv2.INTER_LINEAR)

plt.figure(figsize=[15,15])
plt.subplot(131);plt.imshow(image[:,:,::-1]);plt.title("Original Image")
plt.subplot(132);plt.imshow(resizedUp[:,:,::-1]);plt.title("Scaled Up Image")
plt.subplot(133);plt.imshow(resizedDown[:,:,::-1]);plt.title("Scaled Down Image")

# Scaling Down the image 1.5 times by specifying both scaling factors
scaleUpX = 1.5
scaleUpY = 1.5

# Scaling Down the image 0.6 times specifying a single scale factor.
scaleDown = 0.6

scaledDown = cv2.resize(image, None, fx= scaleDown, fy= scaleDown, interpolation= cv2.INTER_LINEAR)

scaledUp = cv2.resize(image, None, fx= scaleUpX, fy= scaleUpY, interpolation= cv2.INTER_LINEAR)

# We can also use the following syntax for displaying image
plt.figure(figsize=[15,15])
plt.subplot(121);plt.imshow(scaledDown[...,::-1]);plt.title("Scaled Down Image, size = {}".format(scaledDown.shape[:2]));
plt.subplot(122);plt.imshow(scaledUp[...,::-1]);plt.title("Scaled Up Image, size = {}".format(scaledUp.shape[:2]));

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

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

важные ссылки:

https://circuitdigest.com/tutorial/getting-started-with-opencv-image-processing

Операции с изображениями — OpenCV с Python для анализа изображений и видео 4 — YouTube

OpenCV: Начало работы с изображениями

OpenCV: основные операции с изображениями