Примечание от автора:

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

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

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

1.Что такое пиксели, как они используются для формирования изображения.

2.Изображения в виде массива numpy.

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

Пиксели являются строительными блоками изображений:

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

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

  1. Оттенки серого/один канал
  2. Цвет

Возьмем пример изображения:

Изображение на рис. 1.1 имеет ширину 4000 пикселей и высоту 3000 пикселей, всего = 4000 * 3000 = 1 20 00 000 пикселей.

Вы можете найти пиксели вашего изображения, открыв изображение в MS Paint и найти ширину * высоту изображения в пикселях, проверив описание изображения, выделенное (желтым) на рис. 1.2. Существуют и другие способы поиска пикселей изображения с помощью openCV, которые мы обсудим в следующих разделах этой статьи.

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

С другой стороны, цветные изображения представлены в RGB (красный, зеленый и синий). Здесь значения пикселей представлены списком из трех значений: одно значение для красного компонента, одно для зеленого и еще одно для синего.

R в RGB — значения определены в диапазоне от 0 до 255.

G в RGB — значения определены в диапазоне от 0 до 255.

B в RGB — значения определены в диапазоне от 0 до 255.

Все три компонента объединяются в аддитивном цветовом пространстве для формирования цветного одиночного пикселя, обычно представленного в виде кортежа (красный, зеленый, синий). Например, рассмотрим цвет «белый» — мы бы полностью заполнили каждое из красных, зеленых и синих ведер, вот так: (255, 255, 255). Затем, чтобы создать черный цвет, мы должны опустошить каждое из ведер (0, 0, 0), поскольку черный — это отсутствие цвета. Чтобы создать чистый красный цвет, мы должны полностью заполнить красное ведро (и только красное ведро): (255, 0, 0).

Мы можем концептуализировать изображение RGB как состоящее из трех независимых матриц ширины W и высоты H, по одной для каждого компонента RGB. Мы можем объединить эти три матрицы, чтобы получить многомерный массив формы W×H×D, где D — глубина или количество каналов (для цветового пространства RGB D = 3).

В ПОРЯДКЕ ! Снова вернемся к основам. Изображение представлено в виде сетки пикселей. Предположим, что сетка — это лист миллиметровой бумаги. Используя эту миллиметровую бумагу, исходная точка (0,0) соответствует верхнему левому углу изображения. Когда мы движемся вниз и вправо, значения x и y увеличиваются. Как показано на рис. 1.5 ниже, буква «L» размещена на листе миллиметровой бумаги. Доступ к пикселям осуществляется по их координатам (x,y), где мы идем на x столбцов вправо и на y строк вниз, имея в виду, что Python имеет нулевой индекс.

Изображения в виде массива NumPy:

Библиотеки обработки изображений, такие как OpenCV и scikit-image, представляют изображения RGB в виде многомерных массивов NumPy с формой (высотой, шириной, глубиной). Следует отметить, что сначала идет высота, а ширина из-за матричных обозначений. При определении размеров матрицы мы всегда записываем ее как строки x столбцы. Количество строк в изображении — это его высота, а количество столбцов — это ширина изображения. Глубина все равно останется глубиной. Глубина указывает, является ли изображение цветным или изображением в градациях серого. Если глубина равна 1, то изображение имеет оттенки серого. В то время как глубина 3 указывает на то, что это цветное изображение RGB.

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

OpenCV (библиотека с открытым исходным кодом Computer Vision) — это библиотека программного обеспечения для компьютерного зрения и машинного обучения с открытым исходным кодом. Библиотека OpenCV содержит более 2500 оптимизированных алгоритмов, включая полный набор как классических, так и современных алгоритмов компьютерного зрения и машинного обучения. Эти алгоритмы можно использовать для обнаружения и распознавания лиц, идентификации объектов, классификации действий человека в видео, отслеживания движений камеры, отслеживания движущихся объектов и т. д.

Для читателей, которые не знакомы с настройкой среды python, следуйте статье о настройке python (нажмите на ссылку), чтобы настроить python на вашем локальном компьютере. Следуйте инструкциям как есть.

Для этой небольшой программы на Python я буду использовать notepad++ и командную строку Windows для выполнения программы.

После установки питона. Откройте командную строку и установите библиотеку OpenCV, используя приведенную ниже команду.

pip install opencv-python

После успешной установки библиотеки OpenCV откройте любой редактор по вашему выбору или блокнот++ и введите приведенные ниже строки кода.

#Чтение изображения с диска

import cv2
image = cv2.imread("C:/Sample_program/example.jpg")
print(f'(Высота,Ширина,Глубина) изображения: { image.shape}')
cv2.imshow("Изображение", изображение)
cv2.waitKey(0)

Здесь мы загружаем изображение с именем example.jpg с диска и отображаем его на нашем экране. Мой вывод терминала следующий:

Это изображение имеет ширину 552 пикселя (количество столбцов), высоту 515 пикселов (количество строк) и глубину 3 (количество каналов).

Чтобы получить доступ к отдельному значению пикселя из нашего изображения, мы используем простую индексацию массива NumPy: скопируйте и вставьте приведенный ниже код Python в свой редактор и выполните.

import cv2
image = cv2.imread("C:/Sample_program/example.jpg")
# Получить значение координаты пикселя как [y,x] из пользователь, для которого должны быть вычислены значения RGB
[y,x] = list(int(x.strip()) for x in input().split(','))
# Извлеките (синий, зеленый, красный) значения полученной координаты пикселя
(b,g,r) = image[y,x]
print (f' Значение сине-зелено-красного компонента изображения в позиции [y,x]:{(y,x)} равно: {(b,g,r)}')

Вышеупомянутая программа выводит:

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

Мы можем проверить приведенный выше вывод с помощью MS Paint следующим образом:

В порядке ! давайте найдем цвет моих губ на изображении ниже:

Откройте изображение в MSPaint и поместите курсор на «губы», проверив координаты пикселей (x, y) в левом нижнем углу (выделены желтым цветом), как показано ниже Рис. 1.9

Введите полученную координату пикселя в программу python, извлеките значения RGB и откройте «Редактировать цвета» в MS Paint, чтобы ввести полученные значения RGB и проверить цвет редактируемых цветов по отношению к координатной точке пикселя изображения, как показано на рис. 1.10.

Следует отметить, что MS Paint дает координаты пикселей в (x, y), противоположные соглашению OpenCV, и аналогичным образом значения RGB также перевернуты по сравнению с выходным форматом OpenCV BGR.

Бонусное чтение:

Представление изображения использует 4 типа типов данных — Unsigned character: тип 1, int: тип 2, float: тип 4 и комплекс: тип 8, причем Unsigned Charter является наиболее популярным, как показано в таблице ниже. Числовое представление справа, как показано на рисунке 1.11, представляет собой количество байтов, которые мы используем для хранения пикселей в памяти.

Примечание. 1 байт представляет собой набор из 8 бит.

Таким образом, для изображения 28 x 28 общее количество пикселей будет 28 x 28 = 784 пикселя, а общая память для типа данных 1 составит 1B * 784 = 784байта, что означает один Байты памяти необходимы для хранения одного пикселя изображения.

Аналогично, для типа данных 4 (с плавающей запятой) одно и то же изображение будет занимать 4B * 784 = 1568 байт, что означает, что для хранения одного пикселя изображения требуется два байта памяти. .

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

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

Не забудьте подарить нам свой 👏 !