4.13. Formaty pikseli

Ostatni etap potoku ISP pakuje każdy piksel do określonego układu bajtów w pamięci. Wybrany format godzi kompromisy między jakością obrazu, rozmiarem pamięci i sposobem, w jaki dalszy kod odczytuje bajty z powrotem. Dominuje garść formatów.

4.13.1. RAW (Bayer)

Domyślnym wyjściem jest surowy Bayer – ta sama mozaika z jednym kanałem na piksel, którą produkuje sensor. Jeden bajt na piksel, ułożony we wzorze Bayera: czerwony i zielony naprzemiennie w parzystych wierszach, zielony i niebieski naprzemiennie w nieparzystych wierszach. Nie zastosowano debayeryzacji, więc każda komórka nadal przechowuje tylko wartość, którą przepuścił jej filtr koloru.

Surowy Bayer zajmuje jedną trzecią pamięci gotowego trzykanałowego obrazu RGB – jeden bajt na piksel zamiast trzech – i nie poświęcono żadnych cykli ISP na jego debayeryzację ani konwersję. Kosztem jest to, że kod użytkownika musi sam wykonać debayeryzację, zanim będzie można uruchomić jakiekolwiek przetwarzanie świadome koloru.

4.13.2. RGB888

RGB888 to naturalny gotowy format obrazu kolorowego: trzy bajty na piksel, po jednym dla kanałów czerwonego, zielonego i niebieskiego, po 8 bitów na kanał. Dwadzieścia cztery bity na piksel i niespełna siedemnaście milionów odrębnych kolorów.

RGB888 to koncepcyjny punkt odniesienia dla gotowych obrazów kolorowych i większość oprogramowania spoza płytki nim się posługuje. Na sprzęcie wbudowanym jego główną wadą jest 24-bitowy rozmiar piksela – niebędący wielokrotnością rozmiaru słowa procesora, niewygodny dla wyrównania pamięci i o 50% większy od kolejnego formatu poniżej.

4.13.3. RGB565

RGB565 pakuje każdy piksel do dwóch bajtów: pięć bitów czerwieni, sześć bitów zieleni, pięć bitów błękitu. Dodatkowy bit zieleni odzwierciedla większą wrażliwość oka na zieleń i odpowiada podwójnej wadze kanału zielonego we wzorze Bayera.

RGB565 to domyślny format kolorów w OpenMV Cam. Dwa bajty na piksel są wyrównane do 16 bitów, co pasuje do naturalnych szerokości danych MCU – ładowania, zapisy i arytmetyka pikseli działają z pełną prędkością, a wiele operacji może przetwarzać parę pikseli naraz. 24-bitowe piksele RGB888 nie układają się w ten sposób i obciążają każdy dostęp. 33-procentowa oszczędność pamięci względem RGB888 też się sumuje: QVGA (320 x 240) to 150 KB w RGB565 wobec 225 KB w RGB888, a różnica rośnie wraz z rozdzielczością.

Kompromisem jest 65 tysięcy odrębnych kolorów zamiast siedemnastu milionów. W większości zadań wizji maszynowej różnica jest niewidoczna, ponieważ algorytmy i tak redukują ramkę do reprezentacji progowanych lub z wykrytymi krawędziami, które pomijają większość szczegółów koloru. Dla ludzkiego oka brakujące bity ujawniają się jako delikatne pasmowanie w gładkich gradientach kolorów, ale nie jako coś, co oko od razu wychwytuje.

4.13.4. YUV422

YUV422 rozdziela kolor każdego piksela na wartość luminancji (Y) oraz dwie wartości chrominancji (U i V), a następnie podpróbkowuje chrominancję, ponieważ ludzki wzrok jest znacznie mniej wrażliwy na zmiany koloru niż na zmiany jasności. Każdy piksel niesie własne Y, ale sąsiednie pary pikseli dzielą jedno U i jedno V. Układ bajtów dla każdej pary to cztery bajty – Y0, U, Y1, V – co daje średnio dwa bajty na piksel, identycznie jak w RGB565.

Te dwa bajty znaczą jednak co innego niż w RGB565. Sam kanał Y to gotowy do użycia 8-bitowy obraz w skali szarości, czyli to, co faktycznie przetwarza większość klasycznych algorytmów wizji maszynowej (wykrywanie krawędzi, dopasowywanie szablonów, analiza plam); kanały U i V niosą informację o kolorze dla niewielkiej liczby algorytmów, które jej potrzebują.

YUV422 to właściwy wybór, gdy potok potrzebuje obu – algorytm na wczesnym etapie czytający tylko Y, po którym następuje późniejszy etap wykorzystujący chrominancję do dokładniejszych decyzji o kolorze – ponieważ wartości Y są tam od razu gotowe do użycia bez konwersji przestrzeni barw.

4.13.5. Skala szarości

Skala szarości to jeden bajt na piksel: wyłącznie wartość luminancji, bez żadnego koloru. To najmniejszy gotowy format – o połowę mniejszy od RGB565 i YUV422, jedną trzecią rozmiaru RGB888.

Większość klasycznych algorytmów wizji maszynowej i tak działa na skali szarości, więc porzucenie kanału koloru bezpośrednio z sensora jest często najprostszym i najbardziej oszczędnym pamięciowo wyborem. Wykrywanie krawędzi, znajdowanie linii, analiza plam, dekodowanie kodów QR, dopasowywanie szablonów i wykrywanie AprilTag – wszystko to działa na skali szarości i korzysta z mniejszego bufora.

4.13.6. Inne formaty

Kilka formatów, które OpenMV Cam potrafi wytworzyć, nie wychodzi z potoku ISP w ramach normalnego przepływu.

BINARY to jeden bit na piksel – najmniejsza możliwa reprezentacja. Używana do obrazów progowanych, buforów masek oraz wyjścia dowolnej operacji, która rozróżnia jedynie między dopasowaniem a brakiem dopasowania w każdym pikselu.

JPEG to skompresowany format kolorowy. Niektóre sensory zawierają wbudowany w chip enkoder JPEG i mogą dostarczać ramki skompresowane w JPEG bezpośrednio; w przypadku sensorów bez niego MCU uruchamia enkoder JPEG na gotowej ramce RGB lub w skali szarości po ISP. Tak czy inaczej wyjściem jest strumień bitów JPEG, przydatny do zapisywania ramek na nośniku lub wysyłania ich przez łącze o ograniczonej przepustowości.

PNG to bezstratny format skompresowany. Sensory nie produkują PNG bezpośrednio; MCU kompresuje gotową ramkę RGB lub w skali szarości na żądanie. Przydatny, gdy przepustowość lub pojemność nośnika mają znaczenie, ale stratna kompresja stosowana przez JPEG odrzuciłaby informacje, których aplikacja później potrzebuje.