4.13. Pixelformaten¶
De laatste fase van de ISP-pijplijn verpakt elke pixel in een bepaalde byte-indeling in het geheugen. Het gekozen formaat maakt een afweging tussen beeldkwaliteit, geheugengrootte en hoe downstream-code de bytes weer uitleest. Een handvol formaten domineert.
4.13.1. RAW (Bayer)¶
De standaarduitvoer is raw Bayer – hetzelfde mozaiek met een kanaal per pixel dat de sensor produceert. Een byte per pixel, neergelegd in het Bayer-patroon: rood en groen afwisselend op even rijen, groen en blauw afwisselend op oneven rijen. Er is geen debayering toegepast, dus elke cel bevat nog steeds alleen de waarde die het kleurenfilter heeft doorgelaten.
Raw Bayer is een derde van het geheugen van een afgewerkte driekanaals RGB-afbeelding – een byte per pixel tegenover drie – en er zijn geen ISP-cycli besteed aan het debayeren of converteren ervan. Het nadeel is dat gebruikerscode zelf de debayering moet uitvoeren voordat enige kleurbewuste verwerking kan plaatsvinden.
4.13.2. RGB888¶
RGB888 is het natuurlijke afgewerkte formaat voor een kleurenafbeelding: drie bytes per pixel, een voor elk van de rode, groene en blauwe kanalen, met 8 bits per kanaal. Vierentwintig bits per pixel en net geen zeventien miljoen verschillende kleuren.
RGB888 is de conceptuele referentie voor afgewerkte kleurenafbeeldingen en de meeste software buiten het bord spreekt het. Op embedded hardware is het belangrijkste nadeel de pixelgrootte van 24 bits – geen veelvoud van de woordgrootte van de processor, lastig voor geheugenuitlijning en 50% groter dan het volgende formaat eronder.
4.13.3. RGB565¶
RGB565 verpakt elke pixel in twee bytes: vijf bits rood, zes bits groen, vijf bits blauw. De extra groene bit weerspiegelt de hogere gevoeligheid van het oog voor groen, en het komt overeen met het dubbele gewicht van het groene kanaal in het Bayer-patroon.
RGB565 is het standaard kleurformaat op de OpenMV Cam. Twee bytes per pixel is 16-bit uitgelijnd, wat past bij de natuurlijke databreedtes van de MCU – pixels laden, opslaan en rekenwerk lopen allemaal op volle snelheid, en veel bewerkingen kunnen een paar pixels tegelijk verwerken. De 24-bits pixels van RGB888 lijnen niet op die manier uit en kosten bij elke toegang extra. De geheugenbesparing van 33 procent ten opzichte van RGB888 telt ook op: QVGA (320 x 240) is 150 KB in RGB565 tegenover 225 KB in RGB888, en de kloof groeit met de resolutie.
De afweging is 65 duizend verschillende kleuren in plaats van zeventien miljoen. Voor de meeste machine vision-taken is het verschil onzichtbaar, omdat de algoritmen het frame reduceren tot representaties met drempelwaarden of randdetectie die de meeste kleurdetails toch al weggooien. Voor menselijke waarneming tonen de ontbrekende bits zich als zwakke banding in vloeiende kleurovergangen, maar niet als iets dat het oog onmiddellijk opvalt.
4.13.4. YUV422¶
YUV422 splitst de kleur van elke pixel op in een luminantiewaarde (Y) en twee chrominantiewaarden (U en V), en subsampelt vervolgens de chrominantie omdat menselijk zicht veel minder gevoelig is voor kleurvariatie dan voor helderheidsvariatie. Elke pixel draagt zijn eigen Y, maar aangrenzende pixelparen delen een U en een V. De byte-indeling voor elk paar is vier bytes – Y0, U, Y1, V – wat neerkomt op gemiddeld twee bytes per pixel, identiek aan RGB565.
De twee bytes betekenen echter iets anders dan die van RGB565. Het Y-kanaal alleen is een kant-en-klare 8-bits grijswaardenafbeelding, en dat is wat de meeste klassieke machine vision-algoritmen (randdetectie, template matching, blob-analyse) daadwerkelijk gebruiken; de U- en V-kanalen dragen de kleurinformatie voor het kleine aantal algoritmen dat het nodig heeft.
YUV422 is de juiste keuze wanneer de pijplijn beide nodig heeft – een algoritme in een vroege fase dat alleen Y leest, gevolgd door een latere fase die de chroma gebruikt voor fijnere kleurbeslissingen – omdat de Y-waarden daar klaar voor gebruik liggen zonder een kleurruimteconversie.
4.13.5. Grijswaarden¶
Grijswaarden is een byte per pixel: alleen de luminantiewaarde, helemaal geen kleur. Het is het kleinste afgewerkte formaat – de helft van de grootte van RGB565 en YUV422, een derde van de grootte van RGB888.
De meeste klassieke machine vision-algoritmen werken toch op grijswaarden, dus het kleurkanaal rechtstreeks uit de sensor laten vallen is vaak de eenvoudigste en meest geheugenefficiente keuze. Randdetectie, lijndetectie, blob-analyse, QR Code-decodering, template matching en AprilTag-detectie draaien allemaal op grijswaarden en profiteren van de kleinere buffer.
4.13.6. Andere formaten¶
Een paar formaten die de OpenMV Cam kan produceren komen niet als onderdeel van de normale flow uit de ISP-pijplijn.
BINARY is een bit per pixel – de kleinst mogelijke representatie. Gebruikt voor afbeeldingen met drempelwaarden, maskerbuffers en de uitvoer van elke bewerking die bij elke pixel alleen onderscheid maakt tussen overeenkomst en geen overeenkomst.
JPEG is een gecomprimeerd kleurformaat. Sommige sensoren bevatten een on-chip JPEG-encoder en kunnen rechtstreeks JPEG-gecomprimeerde frames leveren; voor sensoren zonder zo’n encoder draait de MCU na de ISP een JPEG-encoder over een afgewerkt RGB- of grijswaardenframe. Hoe dan ook is de uitvoer een JPEG-bitstream, nuttig om frames op te slaan of ze over een verbinding met beperkte bandbreedte te verzenden.
PNG is een verliesvrij gecomprimeerd formaat. Sensoren produceren PNG niet rechtstreeks; de MCU comprimeert op verzoek een afgewerkt RGB- of grijswaardenframe. Nuttig wanneer bandbreedte of opslag van belang is maar de verliesgevende compressie die JPEG toepast informatie zou weggooien die de toepassing later nodig heeft.