Основы изображения: хранение, цветовые пространства и манипуляции

Если вас интересует человеческое зрение, прочтите часть 2 здесь.

Следуя тому, что мы узнали о человеческом зрении, теперь мы собираемся перенести часть этих знаний на компьютерное зрение (интересно, правда ?!).

Чтобы быстро объяснить / резюмировать эту серию, Джозеф Редмон в сентябре 2018 года выпустил серию из 20 лекций по компьютерному зрению. Поскольку он является экспертом в этой области, я написал много заметок, читая его лекции. Я привожу в порядок свои заметки для использования в будущем, но также размещаю их на Medium, чтобы, надеюсь, быть полезными для других.



Если у вас есть время, я настоятельно рекомендую посмотреть эту лекцию на канале Джозефа на YouTube здесь.

СОДЕРЖАНИЕ

Что такое изображение?

Чтобы отойти от человеческого зрения, давайте начнем с очень фундаментального вопроса: «Что такое изображение?»

Наши глаза проецируют свет на сетчатку, перевернув единственную точку, где фокусное расстояние - это расстояние до «виртуального» изображения. По сути, это проекция трехмерного мира на двухмерную плоскость.

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

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

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

Как вы можете видеть выше, только красный свет проходит через красный фильтр, зеленый - через зеленый фильтр, а синий - через синий фильтр. Накладывая это на нашу 2D-сетку датчиков, мы получаем такую ​​картину:

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

Эти значения, конечно, ограничены снизу на 0, но также ограничены сверху, поскольку датчики в наших глазах становятся насыщенными. Эта верхняя граница обычно равна 255, так что каждый пиксель может уместиться в байт и по-прежнему представлять больше цветов, чем люди могут даже различить (около 1 миллиона). Чем выше значение, тем больше света попадает в этот пиксель.

Чтобы идентифицировать один пиксель в этой матрице, вы можете использовать строку, столбец (r, c) (как в математике) или координаты x, y, которые обычно используются в компьютерном зрении. Оба эти обозначения считают верхний левый пиксель источником (0, 0), и какой из них вы используете, на самом деле не имеет значения, если вы последовательны. Однако это очень полезно знать, если вы читаете StackOverflow и т. Д.

Итак, вот как камера захватывает изображение в манере (под влиянием человека), но как эта матрица затем сохраняется для наших целей?

Сохранение изображения: 3D-тензоры с каналами RGB

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

Если мы расширим систему координат до (x, y, c), где c представляет цветовой канал, наше цветное изображение теперь будет представлено трехмерным тензором.

В цветовом пространстве RGB «c» может быть 0, 1 или 2, где 0 - красный, 1 - зеленый и 2 - синяя матрица. Давайте визуализируем это, чтобы избежать путаницы:

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

Чтобы расширить это до обычного размера изображения: 1920 x 1080 x 3 - это 1920 пикселей в ширину, 1080 пикселей в высоту и имеет 3 канала.

Однако, чтобы фактически сохранить это в памяти, мы сохраняем его как одномерный вектор (120, 127, 56,…). Это почти всегда основная строка, но MATLAB должен отличаться и использовать отображение основного столбца (о, боль из моих дней бакалавриата по математике).

Основная строка часто называется HW (высота-ширина), а основная колонка - WH (ширина-высота). По сути, самая правая буква - это самая близкая буква, что, как я понимаю, не сразу интуитивно понятно, поэтому вот один из слайдов Джозефа Редмона, сопровождаемый простым примером, который я построил:

Итак, основная строка на слайде выше - HW и синяя. Следовательно, основной столбец - белый и красный. Учитывая следующую сетку 3x3, давайте объясним это замечание «ближе друг к другу».

Большая строка или HW этого изображения (1, 2, 3, 4, 5, 6, 7, 8, 9)

Если вы перемещаетесь по ширине (крайняя правая буква в HW), значения в векторе близки друг к другу, например вдоль верхнего ряда жирным шрифтом (1, 2, 3, 4, 5, 6, 7, 8, 9).

Однако если вы путешествуете по высоте, значения будут дальше друг от друга, и вы прыгнете по вектору. например вниз по первому столбцу, выделенному жирным шрифтом (1, 2, 3, 4, 5, 6, 7, 8, 9).

Наоборот:

Главный столбец или WH этого изображения - (1, 4, 7, 2, 5, 8, 3, 6, 9).

Если вы путешествуете по высоте (крайняя правая буква в WH), значения в векторе близки друг к другу, например. вниз по первому столбцу, выделенному жирным шрифтом (1, 4, 7, 2, 5, 8, 3, 6, 9).

Однако, если вы перемещаетесь по ширине, значения расходятся дальше, и вы прыгаете по вектору. например вдоль первой строки жирным шрифтом (1, 4, 7, 2, 5, 8, 3, 6, 9).

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

Я буду использовать строковый мажор (HW) во всех последующих статьях этой серии.

Теперь давайте добавим каналы ... Иногда вы видите HWC, в котором каналы чередуются:

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

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

Чаще всего мы будем использовать CHW, который в основном накладывает каждый канал один на другой, а затем является основным строкой (все основные красные строки, затем все зеленые, а затем все синие).

CHW - это то, что использует большинство библиотек, поэтому мы будем использовать его в этих статьях.

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

Сохранение изображения: другие цветовые пространства

Чтобы упростить работу с изображениями, мы обычно конвертируем изображения из цветового пространства RGB в HSV или Hue, Saturation, Value.

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

Это преобразование очень сложно объяснить в тексте, но приведенная ниже диаграмма хорошо его иллюстрирует:

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

Каждое изображение в цветовом пространстве HSV по-прежнему представлено трехмерным тензором с тремя каналами. Разница в том, что каналы больше не красные, зеленые и синие (RGB), а вместо них - оттенок, насыщенность и значение (HSV).

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

Мы можем увидеть это в следующем примере:

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

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

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

В этом цветовом пространстве мы можем выполнять манипуляции с изображениями, которые намного сложнее выполнить, если бы изображение было представлено в цветовом пространстве RGB. Например, мы могли бы удвоить все значения насыщенности, чтобы сделать изображение чрезмерно насыщенным. Мы также рассказали об этом в части 1 этой серии.

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

Повторюсь, это довольно сложно сделать в цветовом пространстве RGB, но очень просто в HSV.

Точно так же мы можем очень легко управлять экспозицией изображения, изменяя его значение (опять же, экспозиция рассматривается в части 1).

Изменение значений оттенка изменяет цвета на изображении. Это часто используется в Photoshop для настройки цвета объектов на фотографиях; но у него есть еще одно очень интересное применение.

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

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

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

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

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

Примечание. Для каналов это не имеет смысла, поскольку они дискретны.

Для этого мы используем интерполяцию.

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

Поскольку (0,0) - это точка, и у нас нет никакой информации между точками, вся известная информация представляет собой сетку, а не реальную плоскость. Если мы уменьшим количество этих точек, изображение станет более пиксельным, поэтому для увеличения разрешения нам придется добавлять точки (например, верхняя точка может быть (0,25,0,25)).

Мы можем сделать это несколькими способами.

Ближайший сосед

Учитывая реальное значение (x, y), метод ближайшего соседа просто возвращает ближайшую точку в сетке, для которой у нас есть информация.

Помните, что c по-прежнему целое число, так как каналы дискретны.

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

Треугольная интерполяция

Иногда данные менее структурированы и более разрежены, так как датчики могут сломаться. В этих случаях мы можем использовать треугольную интерполяцию, которая возвращает взвешенную сумму трех ближайших значений к (x, y). Поскольку он возвращает взвешенную сумму, синий и зеленый по-прежнему отображаются, даже если ближайшие соседи в основном красные.

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

Билинейная интерполяция

Учитывая вещественное число (x, y), мы берем коробку из четырех точек вокруг (x, y). Используя эти точки, мы вычисляем взвешенную сумму их значений (как треугольник).

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

Как вы можете видеть на рисунке 18, значение в действительной точке (x, y), называемое q, рассчитывается следующим образом:

q = V1*A1 + V2*A2 + V3*A3 + V4*A4

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

Бикубическая интерполяция

Вышеупомянутая билинейная интерполяция представляет собой линейную интерполяцию двух линейных интерполяций.

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

Подводя итог тому, как изменить размер изображения, мы:

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

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

Заключение

Теперь мы знаем, как представлены изображения и как компьютеры хранят их в двух наиболее распространенных цветовых пространствах (RGB и HSV). Мы рассмотрели некоторые манипуляции с изображениями (некоторые полезны для создания помеченных данных для глубокого обучения) и погрузились в методы интерполяции для изменения размера.

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

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

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

Являясь независимой редакцией, Heartbeat спонсируется и публикуется Comet, платформой MLOps, которая позволяет специалистам по данным и группам машинного обучения отслеживать, сравнивать, объяснять и оптимизировать свои эксперименты. Мы платим участникам и не продаем рекламу.

Если вы хотите внести свой вклад, отправляйтесь на наш призыв к участникам. Вы также можете подписаться на наши еженедельные информационные бюллетени (Deep Learning Weekly и Comet Newsletter), присоединиться к нам в » «Slack и подписаться на Comet в Twitter и LinkedIn для получения ресурсов, событий и гораздо больше, что поможет вам быстрее и лучше строить лучшие модели машинного обучения.