Добро пожаловать в этот учебник, посвященный OpenCV. Этот тип программ чаще всего используется для анализа видео и изображений, такого как чтение автомобильных номеров, распознавание лиц, робототехника, редактирование фотографий и многое другое в C ++, Python, C и Java. В этом руководстве мы рассмотрим OpenCV для анализа изображений.

Во-первых, часть «CV» в OpenCV, как упомянуто в заголовке, означает «компьютерное зрение», а обработка изображений - это лишь небольшая часть компьютерного зрения. Вернемся на несколько шагов назад. Что такое компьютерное зрение?

Как определение в техопедии:

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

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

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

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

Согласно домашней странице OpenCV, OpenCV:

OpenCV (библиотека компьютерного зрения с открытым исходным кодом) выпущена под лицензией BSD и, следовательно, бесплатна как для академического, так и для коммерческого использования. Он имеет интерфейсы C ++, Python и Java и поддерживает Windows, Linux, Mac OS, iOS и Android. OpenCV был разработан для вычислительной эффективности и с упором на приложения реального времени. Написанная на оптимизированном C / C ++, библиотека может использовать преимущества многоядерной обработки. Включенный с OpenCL, он может использовать преимущества аппаратного ускорения базовой гетерогенной вычислительной платформы.

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

Для установки и настройки вы можете обратиться к этой статье на MacOS. По сути, вам понадобятся Python, библиотека OpenCV для Python, numpy и matplotlib.

1. Основные определения и теории

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

Представление изображения - это изображение размеров. M × N определяется функцией b с:

b: DM x DN → In

Где DM = {1, 2,…, M}, DN = {1, 2,…, N} и n = 1, 2, 3,…

Пиксель

Самая маленькая часть изображения - это пиксель, поэтому мы можем назвать ее элементом изображения. Он характеризуется своим положением (i, j) и вектором интенсивности b (i, j).

Гистограмма изображения

Если мы представляем изображение в черно-белом цвете, каждый пиксель изображения имеет значение, которое представляет количество света. Это только информация об интенсивности.

Итак, если у нас есть цифровое изображение с уровнем серого в диапазоне [0, L-1]. Гистограмма - это график, который показывает «вероятность» p (rk) появления серого rk с:

p(rk) = nk/N

  • rk - это k-й уровень серого
  • nk - количество пикселей с k-м уровнем серого
  • N - общее количество пикселей
  • k = 0, 1, 2, 3, 4, 5, …, L-1

Поэтому мы можем назвать это «распределение уровней серого».

Пример гистограммы

Гистограммы многое говорят об изображении. Мы углубимся в это позже.

1. Приложения

Первые шаги

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

import cv2 import matplotlib import numpy

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

Теперь, чтобы получить самое первое приложение OpenCV, мы сначала начнем с гистограммы изображения ниже.

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

import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('gentleman.jpg',0) plt.hist(img.ravel(),256,[0,256]) plt.show()

На изображении много темных участков. Это отражено на диаграмме, поскольку вы можете видеть, что количество пикселей с низким уровнем освещенности очень велико. Результат:

Гамма-коррекция

Исправление (улучшение) - сделать изображение более подходящим, чем исходное, для конкретного приложения.

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

Чтобы понять, что такое гамма-коррекция, сначала нам нужно понять, что такое Преобразование степенного закона. С входными изображениями f (x, y) и после преобразования T у нас есть улучшенное выходное изображение g (x, y):

g(x, y) = T[ f(x, y) ]

Если мы обозначим r, s как уровень серого для f (x, y) и g (x, y) для любой точки (x, y), формулу можно записать как:

s = T(r)

Пример буквы T

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

Итак, чтобы увеличить яркость изображения, мы изменим значение r, чтобы оно достигло значения s. Преобразование степенного закона определено для выполнения работы, и его форма такова:

s = c*ry

Вышеупомянутое преобразование использует r power γ (гамма), поэтому оно называется преобразованием степенного закона. Изменяя значение γ, мы получаем разные результаты. Таким образом, гамма-коррекция - это процесс выбора наилучшего значения гаммы для получения наилучшего выходного изображения.

График для разных значений гаммы

Когда γ ‹1, исходные темные области будут ярче, и гистограмма будет смещена вправо, тогда как при γ› 1 все будет наоборот.

Для этой демонстрации мы будем использовать действительно темное фото, подобное приведенному ниже:

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

import cv2 import numpy as np from matplotlib import pyplot as plt darkImage = cv2.imread('dark.png') plt.imshow(darkImage) plt.show() def adjust_gamma(image, gamma=1.0):    table = np.array([((i / 255.0) ** gamma) * 255                      for i in np.arange(0, 256)]).astype("uint8")    # apply gamma correction using the lookup table    return cv2.LUT(image, table) plt.imshow(adjusted) plt.show()

Обратите внимание на разницу. Это похоже на волшебство, правда? Результат:

Порог

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

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

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

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

Для метода ADAPTIVE_THRESH_GAUSSIAN_C пороговое значение T (x, y) представляет собой взвешенную сумму (взаимная корреляция с окном Гаусса) размера блока x размер блока окрестности (x, y) минус C. Сигма по умолчанию (стандартное отклонение) используется для указанного размера блока. Итак, у нас есть код:

import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('bookpage.jpg') plt.imshow(img) plt.show() grayscaled = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) th = cv2.adaptiveThreshold(grayscaled, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 115, 1) plt.imshow(th) plt.show() cv2.waitKey(0) cv2.destroyAllWindows()

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

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

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

Готовы ли вы проверить свои навыки OpenCV? Узнайте больше о том, как присоединиться к эксклюзивной сети ведущих разработчиков Pangara, здесь.

Первоначально опубликовано на pangara.com 3 октября 2018 г.