4.13. Formati dei pixel¶
Lo stadio finale della pipeline ISP impacchetta ogni pixel in una particolare disposizione di byte in memoria. Il formato scelto bilancia qualità dell’immagine, dimensione in memoria e il modo in cui il codice a valle rilegge i byte. Pochi formati la fanno da padrone.
4.13.1. RAW (Bayer)¶
L’output predefinito è il Bayer grezzo, lo stesso mosaico a un canale per pixel che il sensore produce. Un byte per pixel, disposto secondo il pattern Bayer: rosso e verde alternati sulle righe pari, verde e blu alternati sulle righe dispari. Non è stato applicato alcun debayering, quindi ogni cella contiene ancora solo il valore lasciato passare dal suo filtro di colore.
Il Bayer grezzo occupa un terzo della memoria di un’immagine RGB a tre canali finita – un byte per pixel contro tre – e non sono stati spesi cicli dell’ISP per il debayering o la conversione. Il costo è che il codice utente deve eseguire da sé il debayering prima che possa avviarsi qualsiasi elaborazione che tiene conto del colore.
4.13.2. RGB888¶
RGB888 è il formato finito naturale per un’immagine a colori: tre byte per pixel, uno ciascuno per i canali rosso, verde e blu a 8 bit per canale. Ventiquattro bit per pixel e poco meno di diciassette milioni di colori distinti.
RGB888 è il riferimento concettuale per le immagini a colori finite e la maggior parte del software esterno alla scheda lo gestisce. Su hardware embedded il suo principale svantaggio è la dimensione del pixel a 24 bit: non un multiplo della dimensione della parola del processore, scomodo per l’allineamento in memoria e più grande del 50% rispetto al formato immediatamente inferiore.
4.13.3. RGB565¶
RGB565 impacchetta ogni pixel in due byte: cinque bit di rosso, sei bit di verde, cinque bit di blu. Il bit extra di verde riflette la maggiore sensibilità dell’occhio al verde e corrisponde al doppio peso del canale verde nel pattern Bayer.
RGB565 è il formato colore predefinito sulla OpenMV Cam. Due byte per pixel sono allineati a 16 bit, il che si adatta alle dimensioni di dati naturali dell’MCU: caricamenti, memorizzazioni e operazioni aritmetiche sui pixel vengono eseguiti tutti alla massima velocità e molte operazioni possono elaborare una coppia di pixel alla volta. I pixel a 24 bit di RGB888 non si allineano in quel modo e pagano un costo a ogni accesso. Anche il risparmio di memoria del 33 percento rispetto a RGB888 si fa sentire: QVGA (320 x 240) occupa 150 KB in RGB565 contro 225 KB in RGB888, e il divario cresce con la risoluzione.
Il compromesso è 65 mila colori distinti invece di diciassette milioni. Per la maggior parte dei compiti di visione artificiale la differenza è invisibile, perché gli algoritmi riducono comunque il frame a rappresentazioni sogliate o con rilevamento dei bordi che scartano la maggior parte del dettaglio cromatico. Per la visione umana i bit mancanti si manifestano come un debole banding nei gradienti di colore uniformi ma non come qualcosa che l’occhio nota immediatamente.
4.13.4. YUV422¶
YUV422 divide il colore di ogni pixel in un valore di luminanza (Y) e due valori di crominanza (U e V), per poi sottocampionare la crominanza perché la visione umana è molto meno sensibile alle variazioni di colore che a quelle di luminosità. Ogni pixel porta il proprio Y, ma coppie adiacenti di pixel condividono un U e un V. La disposizione dei byte per ogni coppia è di quattro byte – Y0, U, Y1, V – il che equivale a due byte per pixel in media, identico a RGB565.
I due byte significano però cose diverse rispetto a RGB565. Il solo canale Y è un’immagine in scala di grigi a 8 bit pronta all’uso, ovvero ciò che la maggior parte degli algoritmi classici di visione artificiale (rilevamento dei bordi, template matching, analisi dei blob) consuma effettivamente; i canali U e V trasportano l’informazione cromatica per il piccolo numero di algoritmi che ne hanno bisogno.
YUV422 è la scelta giusta quando la pipeline ha bisogno di entrambi – un algoritmo di primo stadio che legge solo Y seguito da uno stadio successivo che usa la croma per decisioni cromatiche più fini – perché i valori Y sono lì pronti all’uso senza una conversione di spazio colore.
4.13.5. Scala di grigi¶
La scala di grigi è un byte per pixel: il solo valore di luminanza, nessun colore. È il formato finito più piccolo: metà della dimensione di RGB565 e YUV422, un terzo della dimensione di RGB888.
La maggior parte degli algoritmi classici di visione artificiale lavora comunque sulla scala di grigi, quindi scartare il canale del colore direttamente in uscita dal sensore è spesso la scelta più semplice ed efficiente in termini di memoria. Rilevamento dei bordi, ricerca delle linee, analisi dei blob, decodifica dei codici QR, template matching e rilevamento degli AprilTag funzionano tutti sulla scala di grigi e beneficiano del buffer più piccolo.
4.13.6. Altri formati¶
Alcuni formati che la OpenMV Cam può produrre non escono dalla pipeline ISP come parte del flusso normale.
BINARY è un bit per pixel, la rappresentazione più piccola possibile. Usato per immagini sogliate, buffer di maschera e l’output di qualsiasi operazione che distingue solo tra corrispondenza e non corrispondenza su ogni pixel.
JPEG è un formato colore compresso. Alcuni sensori includono un encoder JPEG on-chip e possono fornire direttamente frame compressi in JPEG; per i sensori che non ne hanno uno, l’MCU esegue un encoder JPEG su un frame RGB o in scala di grigi finito dopo l’ISP. In entrambi i casi l’output è un bitstream JPEG, utile per salvare i frame su memoria o inviarli su un collegamento a banda limitata.
PNG è un formato compresso senza perdita. I sensori non producono direttamente PNG; l’MCU comprime su richiesta un frame RGB o in scala di grigi finito. Utile quando la banda o lo spazio di archiviazione sono importanti ma la compressione con perdita applicata dal JPEG scarterebbe informazioni di cui l’applicazione avrà bisogno in seguito.