4.13. Форматы пикселей¶
На последней ступени конвейера ISP каждый пиксель упаковывается в определённую байтовую раскладку в памяти. Выбранный формат представляет собой компромисс между качеством изображения, объёмом памяти и тем, как последующий код считывает эти байты обратно. Доминируют несколько форматов.
4.13.1. RAW (Bayer)¶
Выход по умолчанию – сырой Bayer, та же одноканальная на пиксель мозаика, которую формирует датчик. Один байт на пиксель, разложенный по шаблону Bayer: красный и зелёный чередуются в чётных строках, зелёный и синий – в нечётных. Дебайеринг не применялся, поэтому каждая ячейка по-прежнему хранит лишь то значение, которое пропустил её цветовой фильтр.
Сырой Bayer занимает треть памяти готового трёхканального RGB-изображения – один байт на пиксель вместо трёх – и при этом не было потрачено циклов ISP на дебайеринг или преобразование. Платой за это является то, что пользовательский код должен выполнять дебайеринг сам, прежде чем можно будет запустить любую обработку с учётом цвета.
4.13.2. RGB888¶
RGB888 – естественный готовый формат для цветного изображения: три байта на пиксель, по одному на красный, зелёный и синий каналы при 8 битах на канал. Двадцать четыре бита на пиксель и почти семнадцать миллионов различимых цветов.
RGB888 – концептуальный эталон для готовых цветных изображений, и большинство стороннего ПО работает именно с ним. На встраиваемом оборудовании его главный недостаток – 24-битный размер пикселя: он не кратен размеру слова процессора, неудобен для выравнивания в памяти и на 50% больше следующего по компактности формата.
4.13.3. RGB565¶
RGB565 упаковывает каждый пиксель в два байта: пять бит красного, шесть бит зелёного, пять бит синего. Дополнительный бит зелёного отражает более высокую чувствительность глаза к зелёному и соответствует двойному весу зелёного канала в шаблоне Bayer.
RGB565 – цветовой формат по умолчанию на OpenMV Cam. Два байта на пиксель выровнены по 16 битам, что соответствует естественной разрядности данных MCU – загрузка, сохранение и арифметика над пикселями выполняются на полной скорости, и многие операции могут обрабатывать пару пикселей за раз. 24-битные пиксели RGB888 так не выравниваются и платят за это при каждом обращении. Экономия памяти на 33% по сравнению с RGB888 также накапливается: QVGA (320 x 240) занимает 150 КБ в RGB565 против 225 КБ в RGB888, и разрыв растёт с разрешением.
Компромисс – 65 тысяч различимых цветов вместо семнадцати миллионов. Для большинства задач машинного зрения разница незаметна, потому что алгоритмы сводят кадр к пороговым или контурным представлениям, которые так или иначе отбрасывают большую часть цветовой детализации. Для человеческого восприятия недостающие биты проявляются как слабое полошение на плавных цветовых градиентах, но не как нечто, что глаз замечает мгновенно.
4.13.4. YUV422¶
YUV422 разделяет цвет каждого пикселя на значение яркости (Y) и два значения цветности (U и V), а затем прореживает цветность, поскольку человеческое зрение гораздо менее чувствительно к изменению цвета, чем к изменению яркости. Каждый пиксель несёт собственное Y, но соседние пары пикселей делят одно U и одно V. Байтовая раскладка для каждой пары составляет четыре байта – Y0, U, Y1, V – что в среднем даёт два байта на пиксель, как и у RGB565.
Однако эти два байта означают не то же самое, что у RGB565. Один канал Y – это готовое к использованию 8-битное изображение в оттенках серого, именно то, что фактически потребляет большинство классических алгоритмов машинного зрения (обнаружение границ, сопоставление с шаблоном, анализ блобов); каналы U и V несут цветовую информацию для небольшого числа алгоритмов, которым она нужна.
YUV422 – правильный выбор, когда конвейеру нужно и то и другое: алгоритм на ранней стадии, читающий только Y, за которым следует более поздняя стадия, использующая цветность для более тонких цветовых решений, – потому что значения Y уже лежат готовыми к использованию без преобразования цветового пространства.
4.13.5. Оттенки серого¶
Оттенки серого – это один байт на пиксель: только значение яркости, без цвета вообще. Это самый компактный готовый формат – вдвое меньше RGB565 и YUV422 и втрое меньше RGB888.
Большинство классических алгоритмов машинного зрения так или иначе работают с оттенками серого, поэтому отбрасывание цветового канала прямо на выходе датчика часто оказывается самым простым и экономичным по памяти выбором. Обнаружение границ, поиск линий, анализ блобов, декодирование QR-кодов, сопоставление с шаблоном и обнаружение AprilTag – всё это работает на оттенках серого и выигрывает от меньшего буфера.
4.13.6. Другие форматы¶
Несколько форматов, которые может формировать OpenMV Cam, не выходят из конвейера ISP в рамках обычного потока.
BINARY – это один бит на пиксель, наименее возможное представление. Используется для пороговых изображений, буферов масок и вывода любой операции, которая в каждом пикселе различает только совпадение и несовпадение.
JPEG – сжатый цветовой формат. Некоторые датчики содержат встроенный JPEG-кодировщик и могут выдавать кадры, сжатые в JPEG, напрямую; для датчиков без него MCU запускает JPEG-кодировщик над готовым RGB- или полутоновым кадром после ISP. В любом случае на выходе получается JPEG-битстрим, полезный для сохранения кадров в хранилище или их отправки по каналу с ограниченной пропускной способностью.
PNG – формат сжатия без потерь. Датчики не формируют PNG напрямую; MCU сжимает готовый RGB- или полутоновый кадр по запросу. Полезно, когда важны пропускная способность или объём хранилища, но сжатие с потерями, применяемое JPEG, отбросило бы информацию, которая позже понадобится приложению.