Перейти к содержимому

Opencv как открыть изображение

  • автор:

Не открывается изображение openCV

Для конкатенации путей используйте os.path.join(). Выведите full_path и проверьте, что по этому пути действительно есть картинка.

21 мая 2021 в 2:54
Оно не работает даже если поместить код в папку с картинкой и обратиться по имени
21 мая 2021 в 7:14

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

У OpenCV есть проблемы с чтением из файлов содержащими в пути или имени не английские символы. Чтобы прочитать такие файлы вместо imread() можно использовать такую конструкцию:

image = cv2.imdecode(np.fromfile(full_path, dtype=np.uint8), cv2.IMREAD_COLOR) 

Ну и полный пример, который работает с русскими именами в пути. И, да, chdir тут совершенно не нужен.

import os, cv2 import numpy as np CORRECT_EXTENTIONS = ["png"] def test(): images = [] directory = r".\Русский" for file in os.listdir(directory): extention = file.split('.')[-1] if extention in CORRECT_EXTENTIONS: full_path = os.path.join(directory, file) image = cv2.imdecode(np.fromfile(full_path, dtype=np.uint8), cv2.IMREAD_COLOR) image_mask = cv2.inRange(image, (0,0,0), (127,127,127)) images.append(cv2.resize(image_mask, (64,64))) cv2.imshow('image', np.hstack([image, cv2.cvtColor(image_mask, cv2.COLOR_GRAY2BGR)])) cv2.waitKey(0) return images test() 

OpenCV в Python: Часть 1 — Работа с изображениями и видео

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

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

Не будем терять времени, начнем!

Начало работы с OpenCV

Поскольку мы начинаем с самого начала, в этом разделе мы поговорим об основах обработки изображений. Чтобы начать работать с OpenCV, надо сначала ее установить. Для этого введите команду в терминале (на Windows):

pip install opencv-python

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

Для начала давайте импортируем необходимые библиотеки.

import cv2 import argparse

Модуль cv2 – это и есть OpenCV. Его мы будем использовать для анализа изображений и видео. Модуль argparse будет полезен при работе с аргументами, передаваемыми через терминал. Если вам неудобно работать с командой строкой, можете почитать это руководство (https://www.pyimagesearch.com/2018/03/12/python-argparse-command-line-arguments/), в котором все очень хорошо объясняется.

Работать мы будем с этим изображением.

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

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

ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", required=True, help="path to input image") args = vars(ap.parse_args())

После создания экземпляра argparse , добавим аргумент, который, по сути, сообщает, что изображение передается, как аргумент, и его нужно распарсить. Затем обработанный аргумент передается функции vars() , которая возвращает атрибут dict указанного объекта.

С помощью метода imread из cv2, мы положим изображение в переменную image .

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

Первый аргумент, передаваемый функции – это args[“image”] , обработанный аргумент, содержащий путь к изображению. Поскольку мы сохранили изображение в той же папке, просто передадим имя файла изображения.

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

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

cv2.imshow("Image", image) cv2.waitKey(0)

cv2.waitKey(0) будет ждать, пока пользователь не нажмет любую клавишу, после чего окно с изображением закроется.

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

(h, w) = image.shape[:2] # display image properties print("width: <> pixels".format(w)) print("height: <> pixels".format(h))

OpenCV позволяет сохранить этот файл и записать его на диск. Что интересно, OpenCV также под капотом обрабатывает преобразование типов, то есть вы можете сохранить изначально .jpeg файл в формате .png.

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

cv2.imwrite("folder/newimage.png", image)

А вот и полный код:

import cv2 import argparse ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", required=True, help="path to input image") args = vars(ap.parse_args()) image = cv2.imread(args["image"], cv2.IMREAD_GRAYSCALE) cv2.imshow("Image", image) cv2.waitKey(0) (h, w) = image.shape[:2] # display image properties print("width: <> pixels".format(w)) print("height: <> pixels".format(h)) cv2.imwrite("photos/newimage.png", image)

Команда для выполнения файла:

python app.py --image photo_one.jpeg

Примечание: Я назвал файл с программой app.py, а файл с изображением photo_one.jpeg, не забудьте вставить свои названия.

После выполнения этого файла, вы получите исходное изображение в оттенках серого:

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

Работа с видео в OpenCV

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

Для начала импортируем библиотеки.

import cv2 import numpy as np

Теперь создадим объект VideoCapture , чтобы, как следует из названия, «захватывать» видео.

cap = cv2.VideoCapture(0)

Число, которое мы передаем, означает источник. 0 – первая веб-камера в вашей системе, 1 – вторая и т.д.

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

Затем создадим цикл while , чтобы получать из источника кадр за кадром.

while True: ret, frame = cap.read() cv2.imshow('video feed', frame)

Функция cap.read() возвращает логическое значение (True/False) и кадр. Если кадр был считан верно, то возвращается True.

cv2.imshow() используется для отображения видео. Название видео будет первым аргументом.

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

if cv2.waitKey(1) & 0xFF == ord('q'): break

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

Функция waitKey(0) возвращает -1, когда ввод вообще не производится. Как только происходит событие, то есть нажимается кнопка, она возвращает 32-разрядное целое число.

В этом сценарии 0xFF – это 8-битный двоичный код 11111111, поскольку для представления символа «q». В результате вы получите целое число меньшее 255.

Следовательно, сравнивая целое число со значением ord(char) , мы можем проверить событие нажатия клавиши и прервать цикл[1].

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

cap.release() cv2.destroyAllWindows()

Теперь пришло время запустить файл. На всякий случай, если вы не проследили, приведу весь код этого раздела:

import cv2 import numpy as np cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() cv2.imshow('video feed', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()

После выполнения файла, вы увидите изображение с веб-камеры в окне под названием «video feed». Чтобы закрыть окно, нажмите «q».

Помните, как мы преобразовали наше цветное изображение в оттенки серого и сохранили его на диске? То же самое можно сделать и с видео. Нужно просто внести несколько незначительных изменений.

В цикл while добавьте следующие инструкции:

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cv2.imshow('gray feed', gray)

После сохранения и выполнения файла вы получите два окна:

  1. Исходную версию.
  2. Версию в оттенках серого.

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

Также мы можем сохранить файл с помощью объекта VideoWriter . Перед этим нужно указать переменную fourcc (https://en.wikipedia.org/wiki/FourCC). FourCC – это 4-байтовый код, который используется для указания видеокодека. Полный список кодов можно посмотреть в кодеках FourCC (http://www.fourcc.org/codecs.php).

fourcc = cv2.VideoWriter_fourcc(*'XVID') out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))

Имя выходного файла будет первым аргументом. Затем нужно передать количество кадров в секунду (fps) и размер кадра.

Чтобы сохранить видео, нужно записать каждый кадр в цикле while.

out.write(frame) out.release() cv2.destroyAllWindows()

Не забудьте в конце освободить экземпляр VideoWriter .

import cv2 import numpy as np cap = cv2.VideoCapture(0) fourcc = cv2.VideoWriter_fourcc(*'XVID') out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480)) while True: ret, frame = cap.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) out.write(frame) cv2.imshow('video feed', frame) cv2.imshow('gray feed', gray) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() out.release() cv2.destroyAllWindows()

После выполнения этого кода вы заметите, что видео с именем «output.avi» будет присутствовать в вашем главном каталоге. Вот видео, которое мы только что записали и сохранили на диск.

Итоги

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

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

Ссылки на следующие статьи будут появляться здесь же, так что следите.

Код на GitHub

  1. Getting Started with Videos — OpenCV-Python Tutorials 1 documentation (opencv-python-tutroals.readthedocs.io)

Как предобрабатывать изображения с OpenCV

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

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

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

Но для начала попробуем разобраться, что такое изображение для компьютера?

Изображение можно определить как двумерную функцию F(x,y), где x и y — координаты на плоскости изображения, а амплитуда f называется интенсивностью или яркостью изображения в точке с этими координатами. В цифровых изображениях значение функции F(x, y) – конечно. То есть, цифровое изображение – это массив пикселей, расположенных в столбцах и строках. Пиксели — это элементы изображения, которые содержат информацию о насыщенности. Изображение также может быть представлено в 3D, где x, y и z становятся пространственными координатами. Пиксели расположены в виде матрицы. F(x,y) – черно-белое изображение, F(x,y,z) – цветное.

Отличие черно-белого изображение от цветного колоссально. Первое – это одномерное пространство черных и белых точек, пикселей. Цветное изображение обычно представляется в виде трех одномерных пространств, наложенных друг на друга:

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

От слов к делу. Самый популярный инструмент для обработки изображений на питоне – OpenCV. Для изучения инструмента написано много литературы, он довольно прост в установке и работе. Также установим модуль matplotlib. С его помощью можно выводить изображения в интерфейсе Jupyter-Notebook. Для установки выполним в командной строке 2 простые команды:

pip install opencv-python pip install matplotlib

Теперь попробуем преобразовать цветного тигра в черно-белого. Делается это просто. Для начала импортируем библиотеки, которые понадобятся для работы:

import cv2 import numpy as np from matplotlib import pyplot as plt

Теперь «прочитаем» изображение, используя функцию cv2.imread(). А за преобразование цветных картинок в черно-белые, используем функцию cv2.cvtColor с параметром cv2.COLOR_BGR2GRAY():

image = cv2.imread(‘tiger.jpg’) image = np.flip(image, axis=-1) bw_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

Посмотрим, что получилось, используя следующий код:

images = [] images.append(image) images.append(bw_img) titles = [‘тигр’,’тигр чб’] for i in range(len(images)): plt.subplot(1,2,i+1),plt.imshow(images[i],’gray’) plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show()

В результате выполнения этих команд будут выведены изображения:

Получившуюся картинку можно сохранить, используя функцию cv2.imwrite():

cv2.imwrite(‘bw_tiger.jpg’, bw_tiger)

Теперь перейдем к более сложным алгоритмам обработки изображений.

Морфологическая обработка изображений:

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

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

Есть два вида морфологического преобразования:

— дилатация (морфологическое расширение) – свертка изображения или выделенной области изображения с шаблоном. В шаблоне выделяется единственная ведущая позиция (anchor), которая совмещается с текущим пикселем при вычислении свертки. Во многих случаях в качестве шаблона выбирается квадрат или круг с ведущей позицией в центре. Такая операция вызывает рост светлых областей на изображении;

— эрозия (морфологическое сужение) – операция обратная дилатации. Эта операция вызывает уменьшение светлых областей на изображении:

Применение этих операции может повысить «читаемость» текста.

Посмотрим, как это работает, используя функции cv2.dilate(), cv2.erode() с заранее заданным ядром (kernel) размером 3х3 пикселя:

# чтение изображения img = cv2.imread(‘letters.jpg’) # определение ядра свертки morph_kernel = np.ones((3, 3)) # применение функций к изображению # параметр iterations означает, сколько раз будет применена операция dilate_img = cv2.dilate(img, kernel= morph_kernel, iterations=1) erode_img = cv2.erode(img, kernel= morph_kernel, iterations=1)

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

Фильтр размытия по гауссу:

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

Итак, пусть исходное изображение будет задано яркостью x(m,n). Гауссово размытие с радиусом r считается по формуле:

Вывод формулы займет слишком много места и не так важен. На хабре есть подробное описание (https://habr.com/ru/post/151157/), как из формулы получается такое ядро фильтра:

Размытие по Гауссу на изображении в OpenCV происходит в два этапа. В первом проходе так называемое ядро фильтра Гаусса размывает изображение по одной из плоскостей (горизонтальная или вертикальная). А во втором проходе размывает по оставшейся плоскости.

Применим фильтр Гаусса в OpenCV, используя функцию cv2.GaussianBlur():

img = cv2.imread(‘distorted.png’) # параметром ksize=(11, 11) зададим размер ядра фильтра размытия 11х11 пикселей: # параметры sigmaX/Y 0, 0 отвечают за сдвиг ядра при проходе по осям X, Y blurred_img = cv2.GaussianBlur(img, ksize=(11, 11), sigmaX =0, sigmaY=0)

Результат выполнения функций:

Повышение резкости изображения:

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

К сожалению, как в старых голливудских фильмах не получится. Нельзя просто взять и преобразовать мелкий кадр номера авто в километре от камеры с разрешением 0.3 мегапикселя в что-то читаемое. Но можно попытаться. И для этого есть метод в OpenCV! И он предполагает применение фильтра к изображению! Кстати, подробнее о других фильтрах для обработки можно почитать на вики https://en.wikipedia.org/wiki/Kernel_(image_processing).

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

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

Сначала зададим ядро фильтра (матрицу), после чего — применим ее к изображению, используя функцию cv2.filter2D():

img = cv2.imread(‘blurred.jpg’) sharp_filter = np.array([[-1, -1, -1], [-1, 9, -1], [-1, -1, -1]]) # параметр ddepth отвечает за «глубину» картинки # ddepth=-1 означает, что глубина получившейся картинки будет как у исходной sharpen_img = cv2.filter2D(img, ddepth=-1, kernel=sharp_filter)

Результат выполнения функций:

Определение границ объектов на изображении:

Да, есть и такие задачи. Данный метод может пригодиться для извлечения «полезной» информации о форме объекта из изображения. Для определения формы объекта, человек подсознательно ищет резкие переходы между уровнями яркости частей объектов. Сделаем точно так же и в машинном алгоритме.

Наиболее распространенным алгоритмом обнаружения краев является фильтр (оператор) Собеля. Этот оператор основан на свёртке изображения небольшими сепарабельными целочисленными фильтрами в вертикальном и горизонтальном направлениях, поэтому его относительно легко вычислять. С другой стороны, используемая им аппроксимация градиента достаточно грубая, особенно это сказывается на высокочастотных колебаниях изображения. Оператор вычисляет градиент яркости изображения в каждой точке. Так находится направление наибольшего увеличения яркости и величина её изменения в этом направлении. Результат показывает, насколько «резко» или «плавно» меняется яркость изображения в каждой точке, а значит, вероятность нахождения точки на грани, а также ориентацию границы.

Оператор использует 2 ядра 3х3, которыми сворачивают исходное изображение для вычисления приближённых значений производных по горизонтали и по вертикали. Пусть А —исходное изображение, а Gx и Gy— два изображения, на которых каждая точка содержит приближённые производные по x и y. Они вычисляются следующим образом (* — операция свертки):

Координата x здесь возрастает «направо», а y — «вниз». В каждой точке изображения приближённое значение величины градиента можно вычислить путём использования полученных приближенных значений производных:

Для более корректного выделения объекта, рекомендуется немного уменьшить четкость изображения. Здесь используем упомянутый ранее cv2.GaussianBlur(). За применение оператора Собеля в OpenCV отвечает функция cv2.Sobel():

img = cv2.imread(‘tiger.jpg’) # для использования оператора собеля сразу по 2 осям зададим параметры dx=1, dy=1 # используя параметр ddepth=cv2.CV_64F, зададим глубину изображения в 64 бита sobelxy = cv2.Sobel(img, ddepth=cv2.CV_64F, dx=1, dy=1, ksize=5)

Результат выполнения функций:

Благодарю за прочтение! В заключение хочется напомнить, что в материале описаны только некоторые часто используемые алгоритмы обработки изображений. Естественно, их гораздо больше. Для решения разных задач могут понадобиться разные алгоритмы или их комбинации. Постарайтесь применять их там, где это действительно надо и помните главное правило при разработке моделей – «garbage in, garbage out».

Шпаргалка по OpenCV — Python

Обложка поста Шпаргалка по OpenCV — Python

Библиотека компьютерного зрения и машинного обучения с открытым исходным кодом. В неё входят более 2500 алгоритмов, в которых есть как классические, так и современные алгоритмы для компьютерного зрения и машинного обучения. Эта библиотека имеет интерфейсы на различных языках, среди которых есть Python (в этой статье используем его), Java, C++ и Matlab.

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

import cv2 image = cv2.imread("./путь/к/изображению.расширение") cv2.imshow("Image", image) cv2.waitKey(0) cv2.destroyAllWindows() 

Примечание При чтении способом выше изображение находится в цветовом пространстве не RGB (как все привыкли), а BGR. Возможно, в начале это не так важно, но как только вы начнёте работать с цветом — стоит знать об этой особенности. Есть 2 пути решения:

  1. Поменять местами 1-й канал (R — красный) с 3-м каналом (B — синий), и тогда красный цвет будет (0,0,255) , а не (255,0,0) .
  2. Поменять цветовое пространство на RGB:rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)И тогда в коде работать уже не с image, а с rgb_image.

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

На протяжении статьи для вывода изображений будет использоваться следующий код:

import cv2 def viewImage(image, name_of_window): cv2.namedWindow(name_of_window, cv2.WINDOW_NORMAL) cv2.imshow(name_of_window, image) cv2.waitKey(0) cv2.destroyAllWindows() 

Кадрирование

На данный момент этот блок не поддерживается, но мы не забыли о нём! Наша команда уже занята его разработкой, он будет доступен в ближайшее время.

import cv2 cropped = image[10:500, 500:2000] viewImage(cropped, "Пёсик после кадрирования") 

Где image[10:500, 500:2000] — это image[y:y + высота, x:x + ширина] .

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

На данный момент этот блок не поддерживается, но мы не забыли о нём! Наша команда уже занята его разработкой, он будет доступен в ближайшее время.

import cv2 scale_percent = 20 # Процент от изначального размера width = int(img.shape[1] * scale_percent / 100) height = int(img.shape[0] * scale_percent / 100) dim = (width, height) resized = cv2.resize(img, dim, interpolation = cv2.INTER_AREA) viewImage(resized, "После изменения размера на 20 %") 

Эта функция учитывает соотношение сторон оригинального изображения. Другие функции изменения размера изображений можно увидеть здесь.

Поворот

На данный момент этот блок не поддерживается, но мы не забыли о нём! Наша команда уже занята его разработкой, он будет доступен в ближайшее время.

import cv2 (h, w, d) = image.shape center = (w // 2, h // 2) M = cv2.getRotationMatrix2D(center, 180, 1.0) rotated = cv2.warpAffine(image, M, (w, h)) viewImage(rotated, "Пёсик после поворота на 180 градусов") 

image.shape возвращает высоту, ширину и каналы. M — матрица поворота — поворачивает изображение на 180 градусов вокруг центра. -ve — это угол поворота изображения по часовой стрелке, а +ve , соответственно, против часовой.

Перевод в градации серого и в чёрно-белое изображение по порогу

На данный момент этот блок не поддерживается, но мы не забыли о нём! Наша команда уже занята его разработкой, он будет доступен в ближайшее время.

На данный момент этот блок не поддерживается, но мы не забыли о нём! Наша команда уже занята его разработкой, он будет доступен в ближайшее время.

import cv2 gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ret, threshold_image = cv2.threshold(im, 127, 255, 0) viewImage(gray_image, "Пёсик в градациях серого") viewImage(threshold_image, "Чёрно-белый пёсик") 

gray_image — это одноканальная версия изображения.

Функция threshold возвращает изображение, в котором все пиксели, которые темнее (меньше) 127 заменены на 0, а все, которые ярче (больше) 127, — на 255.

Для ясности другой пример:

ret, threshold = cv2.threshold(im, 150, 200, 10) 

Здесь всё, что темнее, чем 150, заменяется на 10, а всё, что ярче, — на 200.

Остальные threshold-функции описаны здесь.

Размытие/сглаживание

На данный момент этот блок не поддерживается, но мы не забыли о нём! Наша команда уже занята его разработкой, он будет доступен в ближайшее время.

import cv2 blurred = cv2.GaussianBlur(image, (51, 51), 0) viewImage(blurred, "Размытый пёсик") 

Функция GaussianBlur (размытие по Гауссу) принимает 3 параметра:

  1. Исходное изображение.
  2. Кортеж из 2 положительных нечётных чисел. Чем больше числа, тем больше сила сглаживания.
  3. sigmaX и sigmaY. Если эти параметры оставить равными 0, то их значение будет рассчитано автоматически.

Больше про размытие здесь.

Рисование прямоугольников

На данный момент этот блок не поддерживается, но мы не забыли о нём! Наша команда уже занята его разработкой, он будет доступен в ближайшее время.

import cv2 output = image.copy() cv2.rectangle(output, (2600, 800), (4100, 2400), (0, 255, 255), 10) viewImage(output, "Обводим прямоугольником лицо пёсика") 

Эта функция принимает 5 параметров:

  1. Само изображение.
  2. Координата верхнего левого угла (x1, y1) .
  3. Координата нижнего правого угла (x2, y2) .
  4. Цвет прямоугольника (GBR/RGB в зависимости от выбранной цветовой модели).
  5. Толщина линии прямоугольника.

Рисование линий

На данный момент этот блок не поддерживается, но мы не забыли о нём! Наша команда уже занята его разработкой, он будет доступен в ближайшее время.

import cv2 output = image.copy() cv2.line(output, (60, 20), (400, 200), (0, 0, 255), 5) viewImage(output, "2 пёсика, разделённые линией") 

Функция line принимает 5 параметров:

  1. Само изображение, на котором рисуется линия.
  2. Координата первой точки (x1, y1) .
  3. Координата второй точки (x2, y2) .
  4. Цвет линии (GBR/RGB в зависимости от выбранной цветовой модели).
  5. Толщина линии.

Текст на изображении

На данный момент этот блок не поддерживается, но мы не забыли о нём! Наша команда уже занята его разработкой, он будет доступен в ближайшее время.

import cv2 output = image.copy() cv2.putText(output, "We 

Функция putText принимает 7 параметров:

  1. Непосредственно изображение.
  2. Текст для изображения.
  3. Координата нижнего левого угла начала текста (x, y) .
  4. Используемый шрифт.
  5. Размер шрифта.
  6. Цвет текста (GBR/RGB в зависимости от выбранной цветовой модели).
  7. Толщина линий букв.

Распознавание лиц

На этот раз без пёсиков.

На данный момент этот блок не поддерживается, но мы не забыли о нём! Наша команда уже занята его разработкой, он будет доступен в ближайшее время.

import cv2 image_path = "./путь/к/фото.расширение" face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') image = cv2.imread(image_path) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale( gray, scaleFactor= 1.1, minNeighbors= 5, minSize=(10, 10) ) faces_detected = "Лиц обнаружено: " + format(len(faces)) print(faces_detected) # Рисуем квадраты вокруг лиц for (x, y, w, h) in faces: cv2.rectangle(image, (x, y), (x+w, y+h), (255, 255, 0), 2) viewImage(image,faces_detected) 

detectMultiScale — общая функция для распознавания как лиц, так и объектов. Чтобы функция искала именно лица, мы передаём ей соответствующий каскад.

Функция detectMultiScale принимает 4 параметра:

  1. Обрабатываемое изображение в градации серого.
  2. Параметр scaleFactor . Некоторые лица могут быть больше других, поскольку находятся ближе, чем остальные. Этот параметр компенсирует перспективу.
  3. Алгоритм распознавания использует скользящее окно во время распознавания объектов. Параметр minNeighbors определяет количество объектов вокруг лица. То есть чем больше значение этого параметра, тем больше аналогичных объектов необходимо алгоритму, чтобы он определил текущий объект, как лицо. Слишком маленькое значение увеличит количество ложных срабатываний, а слишком большое сделает алгоритм более требовательным.
  4. minSize — непосредственно размер этих областей.

На данный момент этот блок не поддерживается, но мы не забыли о нём! Наша команда уже занята его разработкой, он будет доступен в ближайшее время.

Contours — распознавание объектов

Распознавание объектов производится с помощью цветовой сегментации изображения. Для этого есть две функции: cv2.findContours и cv2.drawContours .

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

Сохранение изображения

import cv2 image = cv2.imread("./импорт/путь.расширение") cv2.imwrite("./экспорт/путь.расширение", image) 

Заключение

OpenCV — отличная библиотека с лёгкими алгоритмами, которые могут использоваться в 3D-рендере, продвинутом редактировании изображений и видео, отслеживании и идентификации объектов и людей на видео, поиске идентичных изображений из набора и для много-много чего ещё.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *