- Что такое изображения?
- Как компьютер хранит изображения
- Почему машине сложно идентифицировать изображения
- Применение и использование OpenCV
- Установка OpenCV с Python и Anaconda
- Открытие и сохранение изображений в OpenCV
- Изображение с серым масштабированием в OpenCV
- Цветовые Пространства
- Изучение отдельных компонентов изображения RGB
- Преобразование изображения в отдельный компонент RGB
- Гистограмма представления изображения
- Рисование изображений и фигур с помощью OpenCV
Искусство - это способ видеть, и они говорят, что видеть - значит верить, но верно и обратное: верить - это видеть, и действительно трудно представить жизнь в этом мире без дара видения - наших глаз, как прекрасно быть младенцем когда наши глаза просто открываются, мы видим мир и начинаем узнавать и видеть мир вокруг нас, но со временем то же самое чудесное переживание становится обыденным. Но по мере того, как мы прогрессируем с технологиями, мы находимся на грани того, что машины также могут видеть и понимать это. В настоящее время не похоже на научную фантастику, если вы просто разблокируете свой телефон лицом, но история развития машинного зрения насчитывает более 20 лет.
Первоначальный формальный шаг в этой области был сделан еще в 1999 году в рамках инициативы Intel, когда все проводимые исследования проводились совместно в рамках OPEN CV (компьютерное зрение с открытым исходным кодом), первоначально написанного на C ++, с его первым крупным выпуском 1.0 в 2006 году. в 2009 году, третье место в 2015 году и четвертое только сейчас в 2018 году. Теперь OpenCV имеет интерфейсы C ++, Python и Java и поддерживает Windows, Linux, Mac OS, iOS и Android. Таким образом, его можно легко установить в Raspberry Pi в среде Python и Linux. А Raspberry Pi с OpenCV и подключенной камерой можно использовать для создания множества приложений обработки изображений в реальном времени, таких как обнаружение лиц, блокировка лица, отслеживание объектов, обнаружение автомобильных номеров, система домашней безопасности и т. Д.
Прежде чем приступить к изучению обработки изображений с помощью openCV, важно знать, что такое изображения и как люди и машины воспринимают эти изображения.
Что такое изображения?
Изображения представляют собой двумерное представление спектра видимого света. И спектр видимого света - это всего лишь часть электромагнитного спектра, лежащая между инфракрасным и ультрафиолетовым спектрами.
Как формируются изображения: - когда свет отражается от объекта на пленку, сенсор или сетчатку.
Вот как работают наши глаза: использование барьера для блокировки большинства точек света, оставляющего небольшое отверстие, через которое может проходить свет, называется диафрагмой, и это формирует сильно сфокусированное изображение и является рабочей моделью для камеры с точечным отверстием. но есть проблема с камерой с точечным отверстием, такое же количество света будет попадать в апертуру, что не может быть подходящим для пленки или сформированного изображения, также мы не можем получить сфокусированное изображение, чтобы сфокусировать изображение, которое мы необходимо перемещать пленку вперед и назад, но во многих ситуациях это проблематично.
Или мы можем решить эту проблему, используя линзы, это позволяет нам контролировать размер диафрагмы, и в фотографии это известно как f Stop, обычно меньшее значение f Stop лучше в фотографии.
Размер диафрагмы также позволяет нам получить красивую глубину резкости, называемую в фотографии как боке, это позволяет нам иметь размытый фон, пока мы фокусируемся на изображении.
Как компьютер хранит изображения
Возможно, вы слышали о различных форматах изображений, таких как.png,.jpgG и т. Д., Все это цифровое представление нашего аналогового мира, компьютеры делают это, переводя изображение в цифровой код для хранения, а затем интерпретируя файл обратно в изображение для дисплей. Но в основном они используют общую платформу для хранения изображений, и то же самое верно и для openCV.
OpenCV использует цветовое пространство RGB (красный, зеленый и синий) по умолчанию для своих изображений, где каждая координата пикселя (x, y) содержит 3 значения в диапазоне интенсивностей в 8-битной форме, то есть (0-255, 2 8).
Смешивание разных интенсивностей каждого цвета дает нам полный спектр, поэтому в живописи или искусстве эти три цвета считаются основными, а все остальные - второстепенными, потому что большинство вторичных цветов могут быть образованы основными цветами. Как и для желтого, у нас есть следующие значения: Красный - 255; Зеленый - 255; Синий - 0.
Теперь изображения хранятся в многомерных массивах. В программировании массив - это набор объектов. И здесь мы имеем дело с тремя типами массивов: 1D, 2D и 3D, где D означает размерность.
Цветные изображения хранятся в трехмерных массивах, где третье измерение представляет цвета RGB (которые мы увидим позже), и вместе они образуют пиксели разной интенсивности для изображения, в то время как черно-белые изображения хранятся в двухмерных массивах а также есть два типа черно-белых изображений в оттенках серого и двоичные изображения.
Изображения в оттенках серого формируются из оттенков серого двумерного массива, в то время как двоичные изображения состоят из пикселей черного или белого цвета.
Почему машине сложно идентифицировать изображения
Компьютерное зрение само по себе является сложной задачей, вы можете себе представить, как сложно дать машине чувство зрения, узнавания и идентификации. Есть следующие факторы, которые затрудняют компьютерное зрение.
- Ограничения датчика камеры и объектива
- Посмотреть варианты точек
- Смена освещения
- Масштабирование
- Окклюзии
- Варианты классов объектов
- Неоднозначные изображения / Оптические иллюзии
Применение и использование OpenCV
Несмотря на сложности, компьютерное зрение имеет много историй успеха.
- Роботизированная навигация - самоуправляемые автомобили
- Обнаружение и распознавание лиц
- Поиск картинок в поисковых системах
- Чтение номерного знака
- Распознавание почерка
- Snapchat и фильтры лица
- Распознавание объектов
- Отслеживание мяча и игрока в спорте
- И многое другое!
Установка OpenCV с Python и Anaconda
OpenCV написан на C ++, но очень сложно реализовать его на C ++, и поэтому мы решили реализовать его на языке высокого уровня, таком как python, а также есть дополнительные преимущества реализации OpenCV с python, поскольку Python является одним из самых простых языков. также для начинающих. Он чрезвычайно эффективен для приложений обработки данных и машинного обучения, а также хранит изображения в нескольких массивах, что позволяет нам довольно легко выполнять некоторые очень мощные операции.
Базовое программирование полезно с изучением математики уровня старшей школы, веб-камерой, Python 2.7 или 3.6 (предпочтительнее пакет Anaconda).
Шаг 1. Загрузите и установите пакет Anaconda Python
Перейдите по ссылке: https://www.anaconda.com/download и выберите в зависимости от вашего компьютера, в каком состоянии его окна, Linux или Mac, и вы можете выбрать версию python 2.7 или python 3.7 для 64-битных или 32-битных систем, но теперь в дни большая часть системы 64-битная.
Дистрибутив Python для Anaconda поставляется вместе со студией Spyder, блокнотами jupyter и приглашением anaconda, что делает использование Python очень удобным. Для создания примеров мы использовали бы студию spyder.
Выбор между python 2.7 или 3.7 полностью нейтрален, но, однако, для примеров мы будем использовать python 3.7, так как это будущее питона и он возьмет на себя python 2.7 form 2020, а также большинство библиотек разрабатываются на python 3.7, сохраняя имея в виду будущий аспект Python. Кроме того, он также дает ожидаемые результаты для основных математических операций, таких как (2/5 = 2,5), в то время как python 2.7 оценил бы его как 2. Также print обрабатывается как функция в python 3.7 (print («привет»)), так что это дает практические навыки программистам.
Шаг 2. Создание виртуальной платформы с OpenCV
Мы собираемся установить OpenCV, создав виртуальную платформу для spyder, используя приглашение Anaconda и загруженный здесь файл YML.
С помощью файлов YML мы установим все необходимые пакеты и библиотеки, но, однако, если вы хотите установить какие-либо дополнительные пакеты, вы можете легко установить их через приглашение anaconda, выполнив команду этого пакета.
Перейдите к значку поиска Windows и найдите терминал подсказок anaconda, вы можете найти его в папке anaconda, которую вы только что установили.
Затем вам нужно найти загруженный файл YML, и отсюда у вас есть два варианта: либо изменить каталог вашего терминала на место, где загружен ваш файл YML, либо скопировать файл YML в каталог, где ваша анаконда установлена в большинстве в случаях, когда он находится внутри диска C: \, после копирования вашего YML-файла в указанное место ВЫПОЛНИТЕ следующую команду в своем приглашении
conda env create –f virtual_platform_windows.yml
Поскольку моя система работает в Windows, файл YML и команда соответствуют окнам, однако вы можете изменить их в соответствии с вашей системой, заменив окна на linux или mac соответственно.
Примечание. - Если при извлечении пакета возникает ошибка, сначала установите pytorch и numpy, а затем выполните указанную выше команду.
Теперь найдите навигатор anaconda, и там будет раскрывающееся меню «Приложения на ___» и оттуда выберите виртуальную среду, а затем оттуда вам нужно запустить Spyder studio.
Вот и все, вы готовы приступить к работе!
Открытие и сохранение изображений в OpenCV
Здесь мы объясняем некоторые основные команды и терминологию для использования Python в OpenCV. Мы узнаем о трех основных функциях в OpenCV imread, imshow и imwrite.
# комментарии в Python обозначаются символом #
Импортировать opencv в Python по команде
импорт cv2
Загрузите изображение, используя imread, указав путь к изображению
изображение = cv2.imread ('input.jpg')
Теперь это изображение загружено и сохранено в python в виде переменной, которую мы назвали image
Теперь, чтобы отобразить нашу переменную изображения, мы используем imshow, а первым параметром для функции imshow является заголовок, отображаемый в окне изображения, и его необходимо ввести в (''), чтобы представить имя в виде строки
cv2.imshow ('привет, мир', изображение)
waitkey позволяет нам вводить информацию, когда окно изображения открыто, оставив его пустым, он просто ждет нажатия любой клавиши перед продолжением, помещая числа (кроме 0), мы можем указать задержку, в течение которой вы будете держать окно открытым (время здесь в миллисекундах).
cv2.waitKey ()
«destroyAllWindows» закрывает все открытые окна, если этого не сделать, ваша программа зависнет.
cv2.destroyAllWindows ()
, для этого мы будем использовать numpy, numpy - это библиотека для программирования на Python для добавления поддержки больших многомерных массивов и матриц.
import cv2 #importing numpy import numpy as np image = cv2.imread ('input.jpg') cv2.imshow ('hello_world', image) #shape функция очень полезна, когда мы смотрим на размеры массива, это возвращает кортеж, который дает размер изображения print (image.shape) cv2.waitKey () cv2.destroyAllWindows ()
вывод на консоль - (183, 275, 3). Два размера изображения - 183 пикселя в высоту и 275 пикселей в ширину, а 3 означает, что есть три других компонента (R, G, B), которые создают это изображение (оно показывает что цветные изображения хранятся в трехмерных массивах).
print ('Высота изображения:', (image.shape, 'пикселей')) print ('Ширина изображения:', (image.shape, 'пикселей'))
вывод на консоль - Высота изображения: (183, 'пикселей')
Ширина изображения: (275, 'пикселей')
Сохранение отредактированного изображения в OpenCV
Мы используем imwrite для указания имени файла и изображения, которое нужно сохранить.
cv2.imwrite ('output.jpg', изображение) cv2.imwrite ('output.png', изображение)
Первый аргумент - это имя файла, который мы хотим сохранить, {чтобы прочитать или сохранить файл, который мы используем (''), чтобы указать его как строку}, а второй аргумент - это имя файла.
OpenCV позволяет сохранять изображения в разных форматах.
Изображение с серым масштабированием в OpenCV
Greyscaling это процесс, с помощью которого изображение преобразуется из полного цвета в оттенки серого (черный и белый)
В opencv многие функции делают изображения оттенками серого перед обработкой. Это сделано потому, что это упрощает изображение, действуя почти как уменьшение шума и увеличивая время обработки, поскольку в изображении меньше информации (поскольку изображения в оттенках серого хранятся в двумерных массивах).
import cv2 # загружаем наше входное изображение image = cv2.imread ('input.jpg') cv2.imshow ('original', image) cv2.waitKey () # мы используем cvtcolor для преобразования в оттенки серого gray_image = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) cv2.imshow ('оттенки серого', gray_image) cv2.waitKey () cv2.destroyALLWindows ()
Более простой способ преобразовать изображение в оттенки серого - просто добавить аргумент 0 в функции imread помимо имени изображения.
import cv2 grey_image = cv2.imread ('input.jpg', 0) cv2.imshow ('grayscale', grey_image) cv2.waitKey () cv2.destroyAllWindows ()
import cv2 import numpy as np image = cv2.imread ('input.jpg') print (image.shape) cv2.imshow ('original', image) cv2.waitKey () gray_image = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) cv2.imshow ('оттенки серого', gray_image) print (gray_image.shape) cv2.waitKey () cv2.destroyALLWindows ()
Вывод в консоль: - (183, 275, 3) - для цветного изображения
(183, 275) - для изображения в оттенках серого
Отсюда ясно видно, что цветные изображения представлены трехмерными массивами, а серые изображения - двумерными массивами.
Цветовые Пространства
Цветовые пространства - это способ хранения изображений. RGB, HSV, CMYK - это разные цветовые пространства, это всего лишь простые способы представления цвета.
RGB - красный, зеленый и синий.
HSV - оттенок, насыщенность и значение.
И CMYK обычно используется в струйных принтерах.
Цветовое пространство RGB или BGR
Цветовое пространство OpenCV по умолчанию - RGB. RGB - это аддитивная цветовая модель, которая генерирует цвета путем комбинирования синего, зеленого и красного цветов разной интенсивности / яркости. В OpenCV мы используем 8-битную глубину цвета.
- Красный (0-255)
- Синий (0-255)
- Зеленый (0-255)
Однако OpenCV фактически хранит цвет в формате BGR.
Интересный факт: - Мы используем порядок BGR на компьютерах из-за того, что 32-битные целые числа без знака хранятся в памяти, они по-прежнему сохраняются как RGB. Целое число, представляющее цвет, например: - 0X00BBGGRR будет сохранено как 0XRRGGBB.
Цветовое пространство HSVHSV (оттенок, насыщенность и значение / яркость) - это цветовое пространство, которое пытается представить цвета, которые люди воспринимают. Он хранит информацию о цвете в цилиндрическом представлении цветовых точек RGB.
Hue - значение цвета (0-179)
Насыщенность - Яркость цвета (0-255)
Значение - яркость или интенсивность (0-255)
Формат цветового пространства HSV полезен при цветовой сегментации. В RGB фильтровать определенный цвет непросто, однако HSV значительно упрощает установку цветовых диапазонов для фильтрации определенного цвета, как мы его воспринимаем.
Оттенок представляет цвет в HSV, значение оттенка колеблется от 0 до 180, а не 360, поэтому он не завершает полный круг и поэтому отображается иначе, чем стандартный.
Фильтры цветового диапазона
- Красный - (165-15)
- Зеленый - (45-75)
- Синий - (90-120)
Как мы знаем, изображения хранятся в цветовом пространстве RGB (красный, зеленый и синий), и поэтому OpenCV показывает нам то же самое, но первое, что нужно помнить о формате RGB opencv, это то, что это на самом деле BGR, и мы можем узнать это, посмотрев на форма изображения.
import cv2 import numpy as np image = cv2.imread ('input.jpg') # B, G, R значение для первого 0,0 пикселя B, G, R = изображение print (B, G, R) print (image.shape) # теперь, если мы применим это к изображению в градациях серого gray_img = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) print (gray_img.shape) #gray_image значение пикселя для печати 10,50 пикселей (gray_img)
Вывод в консоль: print (B, G, R) - 6 11 10
печать (image.shape) - (183, 275, 3)
печать (gray_img.shape) - (183, 275)
печать (gray_img) - 69
Теперь в изображении в градациях серого есть только два измерения, поскольку мы помним, что цветное изображение хранится в трех измерениях, третье измерение - это (R, G, B), тогда как в оттенках серого присутствуют только два измерения, поскольку (R, G, B) отсутствует, и для определенной позиции пикселя мы получаем только одно значение, в то время как в цветном изображении мы получили три значения.
Еще одно полезное цветовое пространство - HSV.
import cv2 image = cv2.imread ('input.jpg') hsv_image = cv2.cvtColor (image, cv2.COLOR_BGR2HSV) cv2.imshow ('HSV image', hsv_image) cv2.imshow ('Hue channel', hsv_image) cv2. imshow ('канал насыщения', hsv_image) cv2.imshow ('канал значения', hsv_image) cv2.waitKey () cv2.destroyAllWindows ()
После запуска кода вы можете увидеть четыре изображения, три из которых являются отдельными каналами, а одно - комбинированным изображением HSV.
Изображение канала оттенка довольно темное, потому что его значение варьируется от 0 до 180.
Также обратите внимание, что функция imshow пытается показать вам изображение RGB или BGR, но преобразование HSV перекрывает его.
Кроме того, канал значений будет похож на градации серого изображения из-за его яркости.
Изучение отдельных компонентов изображения RGB
import cv2 image = cv2.imread ('input.jpg') # функция разделения opencv разбивает изображение по каждому индексу цвета B, G, R = cv2.split (image) cv2.imshow ("Red", R) cv2.imshow ("Green", G) cv2.imshow ("Blue", B) # создание исходного изображения путем слияния отдельных цветовых компонентов merged = cv2.merge () cv2.imshow ("merged", merged) # усиление синего цвета объединенным = cv2.merge () cv2.imshow ("объединено с синим усилением ", объединено) # представляет форму отдельных цветовых компонентов. # вывод будет только двумя измерениями, которые будут высотой и шириной, поскольку третий элемент компонента RGB индивидуально представлен print (B.shape) print (R.shape) печать (G.shape) cv2.waitKey (0) cv2.destroyAllWindows ()
Вывод в консоль: # размеры изображения из функции формы
(183, 275)
(183, 275)
(183, 275)
Преобразование изображения в отдельный компонент RGB
В приведенном ниже коде мы создали матрицу нулей с размерами изображения HxW, ноль возвращает массив, заполненный нулями, но с такими же размерами.
Функция формы очень полезна, когда мы смотрим на размер изображения, и здесь мы сделали нарезку этой функции формы. Таким образом, форма будет захватывать все до обозначенных точек, то есть до вторых обозначенных точек, которые будут высотой и шириной изображения, поскольку третья представляет компонент RGB изображения, и нам это здесь не нужно.
import cv2 import numpy as np image = cv2.imread ('input.jpg') B, G, R = cv2.split (image) zeros = np.zeros (image.shape, dtype = "uint8") cv2.imshow («КРАСНЫЙ», cv2.merge ()) cv2.imshow («Зеленый», cv2.merge ()) cv2.imshow («Синий», cv2.merge ()) cv2.waitKey (0) cv2.destroyAllWindows ()
Гистограмма представления изображения
Гистограммное представление изображения - это метод визуализации компонентов изображения.
Следующий код позволяет анализировать изображение с помощью цветовой гистограммы его комбинированных и отдельных цветовых компонентов.
import cv2 import numpy as np # нам нужно импортировать matplotlib для создания графиков гистограмм import matplotlib.pyplot as plt image = cv2.imread ('input.jpg') histogram = cv2.calcHist (,, None,,) # мы строим график histogram, ravel () объединяет наш массив изображений plt.hist (image.ravel (), 256,) plt.show () # просмотр отдельных цветовых каналов color = ('b', 'g', 'r') # мы знаем разделите цвет и нанесите каждый на гистограмму для i, col в enumerate (цвет): histogram2 = cv2.calcHist (,, None,,) plt.plot (histogram2, color = col) plt.xlim () plt.show ()
Давайте разберемся с функцией calcHist с каждым ее отдельным параметром.
cv2.calcHist (изображения, каналы, маска, размер гистограммы , диапазоны)
Изображения: это исходное изображение типа uint 8 или float 32. Оно должно быть указано в квадратных скобках, т.е. «», что также указывает на его массив второго уровня, поскольку изображение для opencv представляет собой данные в форме массива.
Каналы: они также указаны в квадратных скобках. Это индекс канала, для которого мы вычисляем гистограмму, например, если ввод - изображение в градациях серого, его значение равно, для цветных изображений, которые вы можете передать, или для вычисления гистограммы синего, зеленого и красного каналов соответственно.
Маска: маска изображения. чтобы найти гистограмму полного изображения, она указывается как «нет». но если вы хотите найти гистограмму определенной области изображения, вы должны создать для нее изображение-маску и передать его как маску.
Histsize: это количество наших BIN. Необходимо указать в квадратных скобках полный масштаб, который мы проходим.
Диапазоны: это наш диапазон, обычно
Рисование изображений и фигур с помощью OpenCV
Ниже приведены несколько примеров рисования линий, прямоугольников, многоугольников, кругов и т. Д. В OpenCV.
import cv2 import numpy as np # создание черного квадрата изображения = np.zeros ((512,512,3), np.uint8) # мы также можем создать его в черно-белом цвете, однако никаких изменений не будет image_bw = np.zeros ((512,512), np.uint8) cv2.imshow ("черный прямоугольник (цвет)", изображение) cv2.imshow ("черный прямоугольник (Ч / Б)", image_bw)
Линия
# создать линию по черному квадрату # cv2.line (изображение, начальные координаты, конечные координаты, цвет, толщина) # нарисовать диагональную линию толщиной 5 пикселей image = np.zeros ((512,512,3), np.uint8) cv2.line (image, (0,0), (511,511), (255,127,0), 5) cv2.imshow («синяя линия», изображение)
Прямоугольник
# создать прямоугольник поверх черного квадрата # cv2.rectangle (изображение, начальные координаты, конечные координаты, цвет, толщина) # рисование прямоугольника толщиной 5 пикселей image = np.zeros ((512,512,3), np.uint8) cv2.rectangle (изображение, (30,50), (100,150), (255,127,0), 5) cv2.imshow ("прямоугольник", изображение)
Круг# создание круга поверх черного квадрата # cv2.circle (изображение, центр, радиус, цвет, заливка) image = np.zeros ((512,512,3), np.uint8) cv2.circle (image, (100,100), (50), (255,127,0), - 1) cv2.imshow ("круг", изображение)
Многоугольник# создание многоугольника image = np.zeros ((512,512,3), np.uint8) # определяет четыре точки pts = np.array (,,,], np.int32) # позволяет изменять форму наших точек в форме, требуемой полилинии pts = pts.reshape ((- 1,1,2)) cv2.polylines (image,, True, (0,255,255), 3) cv2.imshow ("многоугольник", изображение)
Текст# ввод текста с использованием opencv # cv2.putText (изображение, 'текст для отображения', левая начальная точка загрузки, шрифт, размер шрифта, цвет, толщина) image = np.zeros ((512,512,3), np.uint8) cv2. putText (изображение, «привет, мир», (75,290), cv2.FONT_HERSHEY_COMPLEX, 2, (100,170,0), 3) cv2.imshow («привет, мир», изображение) cv2.waitKey (0) cv2.destroyAllWindows ()
Компьютерное зрение и OpenCV - очень обширные темы, но это руководство было бы хорошей отправной точкой для изучения OpenCV и обработки изображений.