1. Базовая обработка изображений
    а. Вращение
    б. Изменение размера
    c. Перелистывание
    e. Обрезка
    f. Арифметика изображений

Базовая обработка изображений

Вращение

Функция cv2.getRotationMatrix2D принимает три аргумента. Первый аргумент — это точка, вокруг которой мы хотим повернуть изображение (в данном случае центр изображения). Затем мы указываем \theta, число градусов (против часовой стрелки), на которое мы собираемся повернуть изображение. В данном случае мы собираемся повернуть изображение на 45 градусов. Последний аргумент — это масштаб изображения. Мы еще не обсуждали изменение размера изображения, но здесь вы можете указать значение с плавающей запятой, где 1.0 означает, что используются те же исходные размеры изображения.

Однако, если вы укажете значение 2.0, размер изображения увеличится вдвое. Точно так же значение 0,5 вдвое уменьшает размер изображения.

Получив матрицу вращения M из функции cv2.getRotationMatrix2D, мы можем применить поворот к нашему изображению с помощью метода cv2.warpAffine.

#Повернуть на 45 градусов

import cv2
import argparse
import numpy as np

apr = argparse.ArgumentParser()
apr.add_argument(“-i”, “— image”, required=True, help="Путь к изображению")
args = vars(apr .parse_args())

image = cv2.imread(args["image"])
cv2.imshow("Исходное изображение",image)
print(f'(Высота,Ширина,Глубина) Исходного изображения это: {image.shape}')

# Поворот — найти центр изображения по уже известной формуле
height = image.shape[0]
width = image.shape[1]
(cX,cY) = (ширина//2, высота//2)

#rповерните изображение на 45 градусов

M = cv2.getRotationMatrix2D((cX,cY),-45,1.0)
rotated = cv2.warpAffine(image, M, (ширина, высота))
cv2.imshow("Повернутый на 45 градусов», повернуто)
cv2.waitKey(0)
#
повернуть наше изображение вокруг произвольной точки, а не вокруг центра
#M = cv2.getRotationMatrix2D ((сХ — 50, сУ — 50), 45, 1,0)

Первым аргументом этой функции является изображение, которое мы хотим повернуть. Затем мы указываем нашу матрицу поворота M вместе с выходными размерами (шириной и высотой) нашего изображения. Показывает наше изображение, повернутое на 45 градусов. Аналогично, мы можем изменить угол поворота, изменив второй параметр cv2.gerRotationMatrix2D на 90 градусов.

M = cv2.getRotationMatrix2D((cX,cY),-90,1.0)

Изменение размера

Фото

нам нужно помнить о соотношении сторон, чтобы изображение не выглядело перекошенным или искаженным — поэтому мы вычисляем соотношение нового изображения к старому. Давайте сделаем наше новое изображение шириной 250 пикселей.

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

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

#Изменить размер

import cv2
import argparse
import numpy as np

apr = argparse.ArgumentParser()
apr.add_argument(“-i”, “— image”, required=True, help="Путь к изображению")
args = vars(apr .parse_args())

image = cv2.imread(args["image"])
cv2.imshow("Исходное изображение",image)
print(f'(Высота,Ширина,Глубина) Исходного изображения это: {image.shape}')

r = 250.0 / image.shape[1]
#
(ширина, новая высота)
dim = (250,int(image.shape[0] *r ))
# cv2.resize(входное изображение, новое измерение, интерполяция)
resized = cv2.resize(image,dim,interpolation = cv2.INTER_AREA)
#
Последний Параметр — это наш метод интерполяции, который представляет собой алгоритм, работающий за кулисами для обработки изменения размера фактического изображения.
print(f'(Height,Width,Depth) измененного изображения: {resized. shape}')
cv2.imshow("измененный размер", измененный размер)
cv2.waitKey(0)

Соотношение сторон = ширина/высота

Если мы не будем помнить о соотношении сторон, изменение размера приведет к искажению результатов.

листать

#ПОВЕРНУТЬ ГОРИЗОНТАЛЬНО, ВЕРТИКАЛЬНО И ПО ОБЕИМ ОСЯМ

import cv2
import argparse
import numpy as np

apr = argparse.ArgumentParser()
apr.add_argument(“-i”, “— image”, required=True, help="Путь к изображению")
args = vars(apr .parse_args())

image = cv2.imread(args["image"])
cv2.imshow("Исходное изображение",image)

print(f’(Высота,Ширина,Глубина) исходного изображения: {image.shape}’)

#По горизонтали
flipp_h = cv2.flip(image,1)
#
По вертикали
flipp_v= cv2.flip(image ,0)
#
отразить по обеим осям
flipp_b = cv2.flip(image,-1)
cv2.imshow('Horizontal Flip', flipp_h)< br /> cv2.imshow('Вертикальный переворот', flipp_v)
cv2.imshow('перевернутый по обеим осям', flipp_b)
cv2.waitKey(0)

Обрезка

Обрезка — это то, что мы уже сделали выше, используя NumPy Slicing. Здесь мы собираемся использовать MSPaint в последний раз, чтобы извлечь координаты интересующей нас области.

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

**syntax =› image[y1:y2 , x1:x2] ||| Порядок MS Paint — (x1:y1 , x2,y2)

#CROP FACE FROM IMAGE
import cv2
import argparse
import numpy as np

apr = argparse.ArgumentParser()
apr.add_argument(“-i”, “— image”, required=True, help="Путь к изображению")
args = vars(apr .parse_args())

image = cv2.imread(args["image"])
cv2.imshow("Исходное изображение",image)

print(f'(Height,Width,Depth) исходного изображения: {image.shape}')
#
синтаксис =› image[y1:y2 , x1:x2] | || Порядок рисования MS — (x1:y1 , x2,y2)
кадрирование = изображение[71:220,382:527]

cv2.imshow('обрезка',обрезка)
cv2.waitKey(0)

В дальнейшем мы разработаем алгоритмы глубокого обучения, которые смогут автоматически определять интересующий объект на изображении, таком как лицо, номерной знак автомобиля, люди, автомобили, животные, на основе данных. Алгоритмы глубокого обучения могут автоматически локализовать объекты на изображении и предоставлять нам координаты x, y вместо того, чтобы использовать MS Paint для поиска координат. К тому времени мы сделаем из вышеприведенной функции обрезки извлечение интересующих объектов.

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

Арифметика изображений

Вы можете добавить два изображения с помощью функции OpenCV, cv2.add(), или просто с помощью операции numpy, res = img1 + img2. Оба изображения должны быть одинаковой глубины и типа, иначе второе изображение может быть просто скалярным значением.

Однако есть разница между добавлением OpenCV и добавлением Numpy. Добавление OpenCV — это насыщенная операция, а добавление Numpy — операция по модулю.

>>> x = np.uint8([250])
>>> y = np.uint8([10])
# OpenCV addition
>>> print cv2.add(x,y) # 250+10 = 260 => 255
[[255]]
#NumPy addition 
>>> print x+y          # 250+10 = 260 % 256 = 4
[4]

В приведенном выше примере при работе с изображениями нам нужно помнить об ограничениях нашего цветового пространства и типа данных. Например, изображения RGB имеют пиксели, которые находятся в пределах диапазон [0, 255]. Что произойдет, если мы исследуем пиксель с интенсивностью 250 и попытаемся добавить к нему 10? как мы сделали в приведенном выше примере.

По обычным арифметическим правилам мы получили бы значение 260. Однако, поскольку изображения RGB представлены в виде 8-битных целых чисел без знака, 260 не является допустимым значением.

Так что же должно произойти? Должны ли мы выполнить некоторую проверку, чтобы гарантировать, что ни один пиксель не выходит за пределы диапазона [0, 255], таким образом обрезав все пиксели, чтобы иметь минимальное значение 0 и максимальное значение 255?

OpenCV выполнит отсечение и гарантирует, что значения пикселей никогда не выйдут за пределы диапазона [0, 255].

Поэтому обязательно имейте в виду, что между добавлением OpenCV и NumPy есть разница. NumPy выполнит арифметические операции по модулю и «зациклится». OpenCV, с другой стороны, будет выполнять отсечение и гарантировать, что значения пикселей никогда не выйдут за пределы диапазона [0, 255].

#ДОБАВЛЕНИЕ ЗНАЧЕНИЯ 100 К КАЖДОМУ ЗНАЧЕНИЮ ПИКСЕЛЯ. ЗАМЕТИТЕ, КАК ИЗОБРАЖЕНИЕ ТЕПЕРЬ ВЫГЛЯДИТ РАЗМЫВАННЫМ.
import cv2
import argparse
import numpy as np

apr = argparse.ArgumentParser()
apr.add_argument(“-i”, “— image”, required=True, help="Путь к изображению")
args = vars(apr .parse_args())

image = cv2.imread(args["image"])
cv2.imshow("Исходное изображение",image)

M= np.ones(image.shape, dtype = "uint8") * 100
добавлено = cv2.add(image, M)
cv2.imshow("Добавлено", добавлено)< br /> cv2.waitKey(0)

Обратите внимание, что изображение выглядит более «размытым» и значительно ярче оригинала. Это связано с тем, что мы увеличиваем интенсивность пикселей, добавляя к ним 100 и подталкивая их к более ярким цветам.

Однако мы также можем добавить два отдельных изображения, передав два объекта изображения в качестве параметров функции cv2.add.

# ВЫЧИТАНИЕ ЗНАЧЕНИЯ 100 ИЗ КАЖДОГО ЗНАЧЕНИЯ ПИКСЕЛЯ. ЗАМЕТИТЕ, КАК ИЗОБРАЖЕНИЕ ТЕПЕРЬ ВЫГЛЯДИТ ТЕМНЕЕ.
import cv2
import argparse
import numpy as np

apr = argparse.ArgumentParser()
apr.add_argument(“-i”, “— image”, required=True, help="Путь к изображению")
args = vars(apr .parse_args())

image = cv2.imread(args["image"])
cv2.imshow("Исходное изображение",image)

M= np.ones(image.shape, dtype = “uint8”) * 100
sub = cv2.subtract(image, M)
cv2.imshow(“Вычитано”, sub)< br /> cv2.waitKey(0)

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

Чтобы прочитать другие уроки этого курса, перейдите к этой статье, чтобы найти полную программу и оглавление.

- - - - - - - - - - -> "Кликните сюда"

Не забудьте подарить нам свой 👏 !