Добро пожаловать в этот учебник, посвященный 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 г.