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.