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

Целевая аудитория: студенты выпускного курса колледжа, новички в области науки о данных, ИТ-сотрудники, которые хотят переключиться на карьеру в области обработки данных .

Вывод . Главный вывод из этой статьи:

  1. Загрузка изображения с диска
  2. Получение «высоты», «ширины» и «глубины» изображения
  3. Поиск R,G,B компонентов изображения
  4. Рисование с использованием OpenCV

Загрузка образа с диска:

Прежде чем выполнять какие-либо операции или манипуляции с изображением, нам важно загрузить изображение по нашему выбору на диск. Мы выполним это действие с помощью OpenCV. Есть два способа выполнить эту операцию загрузки. Один из способов — загрузить изображение, просто передав путь к изображению и файл изображения в функцию imread OpenCV. Другой способ — передать изображение через аргумент командной строки с помощью модуля python argparse.

#Загрузка изображения с диска

import cv2
image = cv2.imread("C:/Sample_program/example.jpg")
cv2.imshow('Image', image)
cv2.waitKey(0)

Давайте создадим файл с именем Loading_image_from_disk.py в блокноте++. Сначала мы импортируем нашу библиотеку OpenCV, содержащую наши функции обработки изображений. мы импортируем библиотеку, используя первую строку кода как cv2. Во второй строке кода мы читаем наше изображение с помощью функции cv2.imread в OpenCV и передаем путь к изображению в качестве параметра, путь также должен содержать имя файла с расширением формата изображения .jpg, .jpeg, .png или .tiff.

синтаксис// image=cv2.imread("путь/к/вашему/изображению.jpg") //

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

ОШИБКА:

c:\Sample_program›python Loading_image_from_disk.py
Трассировка (последний последний вызов):
Файл «Loading_image_from_disk.py», строка 4, в ‹module›
cv2.imshow( 'Изображение', изображение)
cv2.error: OpenCV(4.3.0) C:\projects\opencv-python\opencv\modules\highgui\src\window.cpp:376: ошибка: (-215:Утверждение не удалось) size.width›0 && size.height›0 в функции 'cv::imshow'

Третья строка кода — это место, где мы фактически отображаем наше загруженное изображение. Первый параметр — это строка или «имя» нашего окна. Второй параметр — это объект, в который было загружено изображение.

Наконец, вызов cv2.waitKey приостанавливает выполнение сценария до тех пор, пока мы не нажмем клавишу на клавиатуре. Использование параметра «0» означает, что любое нажатие клавиши приведет к отмене паузы в выполнении. Пожалуйста, не стесняйтесь запускать свою программу без последней строки кода в вашей программе, чтобы увидеть разницу.

#Чтение изображения с диска с помощью Argparse

import cv2
import argparse

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

image = cv2.imread(args["image"])
cv2.imshow('Image', image)
cv2.waitKey(0)

Умение читать изображение или файл с использованием аргумента командной строки (argparse) является абсолютно необходимым навыком, вы можете узнать больше об аргументе командной строки по ссылке, нажав здесь → Нажмите

Первые 2 строки — это код для импорта необходимых библиотек, здесь мы импортируем OpenCV и Argparse. Мы будем повторять это на протяжении всего курса.

Следующие 3 строки кода обрабатывают аргументы командной строки. Единственный аргумент, который нам нужен, это — image : путь к нашему образу на диске. Наконец, мы анализируем аргументы и сохраняем их в словаре с именем args.

Давайте уделим секунду и быстро обсудим, что такое — переключатель изображения. Изображение «переключатель» («переключатель» является синонимом «аргумента командной строки», и эти термины могут использоваться взаимозаменяемо) — это строка, которую мы указываем в командной строке. Этот переключатель сообщает нашему скрипту Loading_image_from_disk.py, где изображение, которое мы хотим загрузить, находится на диске.

Последние 3 строки кода обсуждались ранее, функция cv2.imread принимает args["image"] в качестве параметра, который представляет собой не что иное, как изображение, которое мы предоставляем в командной строке. cv2.imshow отображает изображение, которое уже сохранено в объекте изображения из предыдущей строки. Последняя строка приостанавливает выполнение скрипта до тех пор, пока мы не нажмем клавишу на клавиатуре.

Одним из основных преимуществ использования argparse — аргумента командной строки является то, что мы сможем загружать изображения из разных папок без необходимости изменять путь к изображению в нашей программе, динамически передавая путь к изображению Пример — «C:\CV_Material\ image\sample.jpg» в командной строке в качестве аргумента, пока мы выполняем нашу программу на Python.

c:\Sample_program›python Loading_image_from_disk.py — изображение C:\CV_Material\session1.JPG

Здесь мы выполняем файл Loading_image_from_disk.pypython из местоположения c:\sample_program, передавая параметр «-image» вместе с путем к изображению C:\CV_Material. \session1.JPG.

Получение «Высоты», «Ширины» и «Глубины» изображения

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

Используя атрибут .shape только что загруженного объекта изображения. мы можем найти высоту, ширину и глубину изображения. Как обсуждалось в предыдущем уроке — 1, высоту и ширину изображения можно перепроверить, открыв изображение в MS Paint. Обратитесь к предыдущему уроку. О глубине изображения мы поговорим на следующих уроках. Глубина также известна как канал изображения. Цветные изображения обычно имеют 3 канала из-за композиции RGB в его пикселях, а изображения в оттенках серого имеют 1 канал. Об этом мы говорили на предыдущем Уроке-1.

#Получение высоты, ширины и глубины изображения

import cv2
import argparse

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

#Единственное отличие от предыдущих кодов — атрибут формы применяется к объекту изображения

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

image = cv2.imread(args["image"])
cv2.imshow('Image', image)
cv2.waitKey(0)

Вывод:

(Высота, Ширина, Глубина) изображения: (538, 723, 3)

Единственным отличием от предыдущих кодов является оператор печати, который применяет атрибут формы к загруженному объекту изображения. f’ — это форматированная строка F-строки @, которая динамически принимает переменные и печатает их.

f’ напишите здесь все, что вы хотите увидеть в операторе печати: {variables,variables,object,object.attribute,}’

здесь мы использовали {object.attribute} внутри цветочной скобки для атрибута .shape для вычисления высоты, ширины и глубины объекта изображения.

#Отдельное получение высоты, ширины и глубины

import cv2
import argparse

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

image = cv2.imread(args["image"])

# Разрез массива NumPy для получения высоты, ширины и глубины по отдельности

print("высота: %d пикселей" % (image.shape[0]))
print("ширина: %d пикселей" % (image.shape[1]))
print («глубина: %d» % (image.shape[2]))

cv2.imshow('Изображение', изображение)
cv2.waitKey(0)

Вывод:

ширина: 723 пикселя
высота: 538 пикселей
глубина: 3

Здесь вместо получения (высота, ширина, глубина) вместе в виде кортежа. мы выполняем нарезку массива и получаем высоту, ширину и глубину изображения по отдельности. 0-й индекс массива содержит высоту изображения, 1-й индекс содержит ширину изображения, а 2-й индекс содержит глубину изображения.

Поиск компонентов R,G,B изображения

#Поиск R,B,G изображения в позиции (x,y)

import cv2
import argparse

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

image = cv2.imread(args["image"])

#Получить значение координаты пикселя как [y,x] от пользователя, для которого должны быть вычислены значения RGB
[y,x] = list(int (x.strip()) для x в input().split(','))

#Извлечь значения (синий,зеленый,красный) полученной координаты пикселя
(b,g,r) = image[y,x]
print(f'Значение сине-зелено-красного компонента изображения в позиции {(y,x)} равно: {(b,g,r)}')

cv2.imshow('Изображение', изображение)
cv2.waitKey(0)

Вывод:

Значение сине-зелено-красного компонента изображения в позиции (321, 308): (238, 242, 253)

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

Мы также можем изменить цвет пикселя в заданной позиции с помощью обратной операции.

(b,g,r) = image[y,x]доimage[y,x] = (b,g,r)

Здесь мы назначаем цвет в (BGR) координате пикселя изображения. Давайте попробуем, назначив КРАСНЫЙ цвет пикселю в позиции (321,308) и проверим то же самое, напечатав BGR пикселя в данной позиции.

#Обратное действие для присвоения значения RGB выбранному пикселю

import cv2
import argparse

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

image = cv2.imread(args["image"])

# Получить значение координаты пикселя как [y,x] от пользователя, для которого должны быть вычислены значения RGB
[y,x] = list(int (x.strip()) для x в input().split(','))

#Извлечь значения (синий,зеленый,красный) полученной координаты пикселя
image[y,x] = (0,0,255)
(b ,g,r) = image[y,x]
print(f'Значение сине-зелено-красного компонента изображения в позиции {(y,x)} равно: {(b,g,r)}' )

cv2.imshow('Изображение', изображение)
cv2.waitKey(0)

Вывод:

Значение сине-зелено-красного компонента изображения в позиции (321, 308): (0, 0, 255)

В приведенном выше коде мы получаем координату пикселя через командную строку, вводя значение, как показано на рис. 2.6 ниже, и назначаем координате пикселя красный цвет, назначая (0,0,255), т. е. (синий, зеленый, красный) и подтвердите то же самое, напечатав координату входного пикселя.

Рисование с использованием OpenCV

Давайте узнаем, как рисовать различные формы, такие как прямоугольник, квадрат и круг, используя OpenCV, рисуя круги, чтобы замаскировать мои глаза, прямоугольник, чтобы замаскировать мои губы, и прямоугольник, чтобы замаскировать рыбу-мантру рядом со мной.

Вывод должен выглядеть так:

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

Мы используем метод cv2.rectangle для рисования прямоугольника и метод cv2.circle для рисования круга в OpenCV.

cv2.rectangle(image, (x1, y1), (x2, y2), (синий, зеленый, красный), толщина)

Метод cv2.rectangle принимает изображение в качестве первого аргумента, в котором мы хотим нарисовать наш прямоугольник. Мы хотим рисовать на нашем объекте изображения, которое мы загрузили, поэтому мы передаем его в метод. Второй аргумент — это начальная позиция (x1, y1) нашего прямоугольника — здесь мы начинаем наш прямоугольник в точке (156, 340). Затем мы должны указать конечную точку (x2, y2) для прямоугольника. Мы решили закончить наш прямоугольник на (360, 450). Следующим аргументом является цвет прямоугольника, который мы хотим нарисовать, в данном случае мы передаем черный цвет в формате BGR, т.е. (0 ,0,0). Наконец, последний аргумент, который мы передаем, — это толщина линии. мы даем -1, чтобы рисовать сплошные фигуры, как показано на рис. 2.6.

Точно так же мы используем метод cv2.circle для рисования круга.

cv2.circle(image, (x, y), r, (синий, зеленый, красный), толщина)

Метод cv2.circle принимает изображение в качестве первого аргумента, в котором мы хотим нарисовать наш прямоугольник. Мы хотим рисовать на нашем объекте изображения, которое мы загрузили, поэтому мы передаем его в метод. Второй аргумент — центр (x, y) нашего круга — здесь мы взяли наш круг в точке (343, 243). Следующий аргумент — это радиус круга, который мы хотим нарисовать. Следующий аргумент — это цвет круга, в данном случае мы передаем КРАСНЫЙ цвет в формате BGR, т. е. (0,0,255). Наконец, последний аргумент, который мы передаем, — это толщина линии. мы даем -1, чтобы рисовать сплошные фигуры, как показано на рис. 2.6.

В порядке ! Зная все это. Попробуем завершить начатое. Чтобы мы могли рисовать фигуры на изображении, нам нужно определить начальную и конечную (x, y) координаты области маскирования, чтобы передать их соответствующему методу.

Как ?

Мы еще раз воспользуемся помощью MS Paint. Поместив курсор на одну из координат (вверху слева) или (внизу справа) области для маскирования, координаты отобразятся в выделенной части MS Paint, как показано на рис. 2.7.

Точно так же мы возьмем все координаты (x1,y1) (x2,y2) для всех маскирующих областей, как показано на рис. 2.8.

#Рисование с использованием OpenCV для маскировки глаз, рта и объектов поблизости

import cv2
import argparse

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

image = cv2.imread(args["image"])

cv2.rectangle(изображение, (415, 168), (471, 191), (0, 0, 255), -1)
cv2.circle(изображение, (425, 150), 15, (0, 0, 255), -1)
cv2.circle(изображение, (457, 154), 15, (0, 0, 255), -1)
cv2.rectangle(изображение, (156, 340), (360, 450), (0, 0, 0), -1)

# показать выходное изображение
cv2.imshow("Выходной рисунок", изображение )
cv2.waitKey(0)

Результат:

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

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