4.13. Formate de pixeli

Etapa finală a pipeline-ului ISP împachetează fiecare pixel într-un anumit aranjament de octeți în memorie. Formatul ales reprezintă un compromis între calitatea imaginii, dimensiunea în memorie și modul în care codul ulterior recitește octeții. Domină o serie restrânsă de formate.

4.13.1. RAW (Bayer)

Ieșirea implicită este Bayer brut – același mozaic cu un singur canal per pixel pe care îl produce senzorul. Un octet per pixel, dispus în tiparul Bayer: roșu și verde alternând pe rândurile pare, verde și albastru alternând pe rândurile impare. Nu s-a aplicat niciun debayer, așa că fiecare celulă reține în continuare doar valoarea pe care a lăsat-o să treacă filtrul ei de culoare.

Bayer brut ocupă o treime din memoria unei imagini RGB finalizate cu trei canale – un octet per pixel față de trei – și nu s-au consumat cicluri ISP pentru debayer sau conversie. Costul este că, înainte de a putea rula orice procesare care ține cont de culoare, codul utilizatorului trebuie să efectueze el însuși operația de debayer.

4.13.2. RGB888

RGB888 este formatul finalizat natural pentru o imagine color: trei octeți per pixel, câte unul pentru canalele roșu, verde și albastru, la 8 biți pe canal. Douăzeci și patru de biți per pixel și ceva mai puțin de șaptesprezece milioane de culori distincte.

RGB888 este referința conceptuală pentru imaginile color finalizate, iar majoritatea software-ului din afara plăcii îl folosește. Pe hardware integrat, principalul său dezavantaj este dimensiunea pixelului de 24 de biți – nu este un multiplu al dimensiunii cuvântului procesorului, este incomod pentru alinierea în memorie și este cu 50% mai mare decât formatul imediat următor.

4.13.3. RGB565

RGB565 împachetează fiecare pixel în doi octeți: cinci biți de roșu, șase biți de verde, cinci biți de albastru. Bitul suplimentar de verde reflectă sensibilitatea mai mare a ochiului la verde și corespunde ponderii duble a canalului verde din tiparul Bayer.

RGB565 este formatul de culoare implicit pe OpenMV Cam. Doi octeți per pixel înseamnă aliniere pe 16 biți, ceea ce se potrivește cu lățimile de date naturale ale MCU-ului – încărcările, stocările și operațiile aritmetice cu pixeli rulează toate la viteză maximă, iar multe operații pot procesa o pereche de pixeli deodată. Pixelii de 24 de biți ai RGB888 nu se aliniază în acest mod și plătesc un cost la fiecare acces. Economia de memorie de 33 la sută față de RGB888 contează și ea: QVGA (320 x 240) ocupă 150 KB în RGB565 față de 225 KB în RGB888, iar diferența crește odată cu rezoluția.

Compromisul este de 65 de mii de culori distincte în loc de șaptesprezece milioane. Pentru majoritatea sarcinilor de viziune artificială diferența este invizibilă, deoarece algoritmii reduc cadrul la reprezentări cu praguri aplicate sau cu detectarea muchiilor, care oricum elimină cea mai mare parte a detaliilor de culoare. Pentru vizionarea umană, biții lipsă se manifestă ca o ușoară benzire în gradienții de culoare netezi, dar nu ca ceva ce ochiul sesizează imediat.

4.13.4. YUV422

YUV422 împarte culoarea fiecărui pixel într-o valoare de luminanță (Y) și două valori de crominanță (U și V), apoi subeșantionează crominanța, deoarece vederea umană este mult mai puțin sensibilă la variația de culoare decât la variația de luminozitate. Fiecare pixel își poartă propriul Y, dar perechile de pixeli adiacenți partajează un singur U și un singur V. Aranjamentul de octeți pentru fiecare pereche este de patru octeți – Y0, U, Y1, V – ceea ce revine în medie la doi octeți per pixel, identic cu RGB565.

Cei doi octeți înseamnă însă lucruri diferite față de cei ai RGB565. Singur, canalul Y este o imagine în tonuri de gri pe 8 biți gata de utilizat, exact ceea ce consumă de fapt majoritatea algoritmilor clasici de viziune artificială (detectarea muchiilor, potrivirea de șabloane, analiza de blob-uri); canalele U și V poartă informația de culoare pentru numărul mic de algoritmi care au nevoie de ea.

YUV422 este alegerea potrivită atunci când pipeline-ul are nevoie de ambele – un algoritm de etapă timpurie care citește doar Y, urmat de o etapă ulterioară care folosește crominanța pentru decizii de culoare mai fine – pentru că valorile Y se află deja acolo, gata de folosit, fără o conversie de spațiu de culoare.

4.13.5. Tonuri de gri

Tonurile de gri înseamnă un octet per pixel: doar valoarea de luminanță, fără niciun fel de culoare. Este cel mai mic format finalizat – jumătate din dimensiunea RGB565 și YUV422, o treime din dimensiunea RGB888.

Majoritatea algoritmilor clasici de viziune artificială lucrează oricum pe tonuri de gri, așa că eliminarea canalului de culoare direct din senzor este adesea alegerea cea mai simplă și mai eficientă din punctul de vedere al memoriei. Detectarea muchiilor, găsirea liniilor, analiza de blob-uri, decodarea codurilor QR, potrivirea de șabloane și detectarea AprilTag rulează toate pe tonuri de gri și beneficiază de tamponul mai mic.

4.13.6. Alte formate

Câteva formate pe care OpenMV Cam le poate produce nu rezultă din pipeline-ul ISP ca parte a fluxului normal.

BINARY înseamnă un bit per pixel – cea mai mică reprezentare posibilă. Folosit pentru imagini cu praguri aplicate, tampoane de mască și ieșirea oricărei operații care distinge la fiecare pixel doar între potrivire și nepotrivire.

JPEG este un format de culoare comprimat. Unii senzori includ un codificator JPEG pe cip și pot livra direct cadre comprimate JPEG; pentru senzorii fără unul, MCU-ul rulează un codificator JPEG peste un cadru RGB sau în tonuri de gri finalizat după ISP. În ambele cazuri, ieșirea este un flux de biți JPEG, util pentru salvarea cadrelor în stocare sau pentru trimiterea lor printr-o legătură cu lățime de bandă limitată.

PNG este un format comprimat fără pierderi. Senzorii nu produc PNG direct; MCU-ul comprimă la cerere un cadru RGB sau în tonuri de gri finalizat. Util atunci când lățimea de bandă sau stocarea contează, dar comprimarea cu pierderi pe care o aplică JPEG ar elimina informații de care aplicația are nevoie ulterior.