4.13. Formáty pixelů

Závěrečná fáze ISP pipeline zabalí každý pixel do konkrétního bajtového rozložení v paměti. Zvolený formát je kompromisem mezi kvalitou obrazu, velikostí paměti a tím, jak navazující kód čte bajty zpět. Dominuje hrstka formátů.

4.13.1. RAW (Bayer)

Výchozím výstupem je surový Bayer – stejná mozaika s jedním kanálem na pixel, jakou produkuje senzor. Jeden bajt na pixel, uspořádaný do Bayerova vzoru: červená a zelená se střídají na sudých řádcích, zelená a modrá se střídají na lichých řádcích. Nebyl proveden žádný debayering, takže každá buňka stále drží pouze hodnotu, kterou propustil její barevný filtr.

Surový Bayer zabírá třetinu paměti oproti hotovému tříkanálovému RGB obrazu – jeden bajt na pixel proti třem – a nebyly vynaloženy žádné cykly ISP na jeho debayering ani konverzi. Cenou za to je, že uživatelský kód musí debayering provést sám, než může proběhnout jakékoli zpracování zohledňující barvy.

4.13.2. RGB888

RGB888 je přirozený hotový formát pro barevný obraz: tři bajty na pixel, po jednom pro červený, zelený a modrý kanál při 8 bitech na kanál. Dvacet čtyři bitů na pixel a necelých sedmnáct milionů odlišných barev.

RGB888 je konceptuálním referenčním formátem pro hotové barevné obrazy a většina softwaru mimo desku jej používá. Na vestavěném hardwaru je jeho hlavní nevýhodou 24bitová velikost pixelu – není násobkem velikosti slova procesoru, je nepohodlná pro zarovnání paměti a je o 50 % větší než další formát níže.

4.13.3. RGB565

RGB565 zabalí každý pixel do dvou bajtů: pět bitů červené, šest bitů zelené, pět bitů modré. Bit zelené navíc odráží vyšší citlivost oka na zelenou a odpovídá dvojnásobné váze zeleného kanálu v Bayerově vzoru.

RGB565 je výchozím barevným formátem na OpenMV Cam. Dva bajty na pixel jsou zarovnány na 16 bitů, což odpovídá přirozeným datovým šířkám MCU – načítání, ukládání i aritmetika pixelů běží plnou rychlostí a mnoho operací dokáže zpracovat dvojici pixelů najednou. 24bitové pixely RGB888 se takto nezarovnají a platí daň při každém přístupu. Sčítá se i 33procentní úspora paměti oproti RGB888: QVGA (320 x 240) má v RGB565 150 KB proti 225 KB v RGB888 a rozdíl s rozlišením roste.

Kompromisem je 65 tisíc odlišných barev místo sedmnácti milionů. Pro většinu úloh strojového vidění je rozdíl neviditelný, protože algoritmy redukují snímek na prahované nebo hranově detekované reprezentace, které stejně většinu barevných detailů zahodí. Pro lidský zrak se chybějící bity projeví jako slabé pásmování v hladkých barevných přechodech, ale ne jako něco, čeho si oko okamžitě všimne.

4.13.4. YUV422

YUV422 rozděluje barvu každého pixelu na hodnotu jasu (Y) a dvě hodnoty barevnosti (U a V) a poté barevnost podvzorkuje, protože lidský zrak je mnohem méně citlivý na změny barvy než na změny jasu. Každý pixel nese vlastní Y, ale sousední dvojice pixelů sdílejí jednu U a jednu V. Bajtové rozložení každé dvojice tvoří čtyři bajty – Y0, U, Y1, V – což vychází na dva bajty na pixel v průměru, shodně s RGB565.

Tyto dva bajty však znamenají něco jiného než u RGB565. Samotný kanál Y je obraz ve stupních šedi v 8 bitech připravený k použití, což je přesně to, co většina klasických algoritmů strojového vidění (detekce hran, porovnávání šablon, analýza blobů) skutečně spotřebovává; kanály U a V nesou barevnou informaci pro malé množství algoritmů, které ji potřebují.

YUV422 je správnou volbou, když pipeline potřebuje obojí – algoritmus v rané fázi, který čte pouze Y, následovaný pozdější fází, která využívá barvonosné kanály pro jemnější barevná rozhodnutí – protože hodnoty Y jsou rovnou k dispozici k použití bez konverze barevného prostoru.

4.13.5. Stupně šedi

Stupně šedi mají jeden bajt na pixel: pouze hodnotu jasu, žádnou barvu. Je to nejmenší hotový formát – poloviční velikost oproti RGB565 a YUV422, třetinová velikost oproti RGB888.

Většina klasických algoritmů strojového vidění stejně pracuje ve stupních šedi, takže vynechání barevného kanálu přímo ze senzoru je často nejjednodušší a paměťově nejúspornější volbou. Detekce hran, hledání čar, analýza blobů, dekódování QR Code, porovnávání šablon a detekce AprilTag – to vše běží ve stupních šedi a těží z menšího bufferu.

4.13.6. Další formáty

Několik formátů, které OpenMV Cam dokáže vytvořit, nevychází z ISP pipeline jako součást běžného toku.

BINARY má jeden bit na pixel – nejmenší možnou reprezentaci. Používá se pro prahované obrazy, masky a výstup jakékoli operace, která v každém pixelu rozlišuje pouze mezi shodou a neshodou.

JPEG je komprimovaný barevný formát. Některé senzory obsahují JPEG enkodér přímo na čipu a mohou dodávat JPEG komprimované snímky přímo; u senzorů bez něj spustí MCU JPEG enkodér nad hotovým RGB snímkem nebo snímkem ve stupních šedi po ISP. V obou případech je výstupem JPEG bitstream, užitečný pro ukládání snímků do úložiště nebo jejich odesílání přes spoj s omezenou šířkou pásma.

PNG je bezztrátový komprimovaný formát. Senzory nevytvářejí PNG přímo; MCU komprimuje hotový RGB snímek nebo snímek ve stupních šedi na vyžádání. Užitečný, když záleží na šířce pásma nebo úložišti, ale ztrátová komprese JPEG by zahodila informace, které aplikace později potřebuje.