4.13. Formatos de pixel¶
A fase final do pipeline do ISP empacota cada pixel num determinado esquema de bytes em memória. O formato escolhido equilibra qualidade de imagem, tamanho de memória e a forma como o código a jusante lê os bytes. Poucos formatos dominam.
4.13.1. RAW (Bayer)¶
A saída predefinida é Bayer em bruto – o mesmo mosaico de um canal por pixel que o sensor produz. Um byte por pixel, disposto no padrão Bayer: vermelho e verde alternados nas linhas pares, verde e azul alternados nas linhas ímpares. Não foi aplicado nenhum debayering, pelo que cada célula ainda contém apenas o valor que o seu filtro de cor deixou passar.
O Bayer em bruto ocupa um terço da memória de uma imagem RGB de três canais concluída – um byte por pixel contra três – e nenhum ciclo do ISP foi gasto em debayering ou conversão. O custo é que o código do utilizador tem de efetuar o debayering antes de qualquer processamento com reconhecimento de cor poder ser executado.
4.13.2. RGB888¶
RGB888 é o formato concluído natural para uma imagem a cores: três bytes por pixel, um para cada um dos canais vermelho, verde e azul a 8 bits por canal. Vinte e quatro bits por pixel e pouco menos de dezassete milhões de cores distintas.
RGB888 é a referência conceptual para imagens a cores concluídas e a maioria do software externo suporta-o. Em hardware embebido, a sua principal desvantagem é o tamanho de pixel de 24 bits – não é múltiplo do tamanho de palavra do processador, é complicado para o alinhamento de memória e é 50% maior do que o formato seguinte.
4.13.3. RGB565¶
RGB565 empacota cada pixel em dois bytes: cinco bits de vermelho, seis bits de verde, cinco bits de azul. O bit extra de verde reflete a maior sensibilidade do olho ao verde, e corresponde ao peso duplo do canal verde no padrão Bayer.
RGB565 é o formato de cor predefinido no OpenMV Cam. Dois bytes por pixel têm alinhamento de 16 bits, o que corresponde às larguras de dados naturais do MCU – carregamentos, armazenamentos e operações aritméticas de pixel funcionam à velocidade máxima, e muitas operações podem processar um par de pixels de uma vez. Os pixels de 24 bits do RGB888 não se alinham dessa forma e têm um custo em cada acesso. A poupança de memória de 33% em relação ao RGB888 também se acumula: QVGA (320 x 240) ocupa 150 KB em RGB565 contra 225 KB em RGB888, e a diferença cresce com a resolução.
O compromisso são 65 mil cores distintas em vez de dezassete milhões. Para a maioria das tarefas de visão por computador, a diferença é invisível, porque os algoritmos reduzem o fotograma a representações com limiarização ou deteção de arestas que descartam a maior parte do detalhe de cor de qualquer forma. Para visualização humana, os bits em falta manifestam-se como finas bandas em gradientes de cor suaves, mas não como algo que o olho assinale imediatamente.
4.13.4. YUV422¶
YUV422 divide a cor de cada pixel num valor de luminância (Y) e dois valores de crominância (U e V), e depois sub-amosta a crominância porque a visão humana é muito menos sensível à variação de cor do que à variação de brilho. Cada pixel transporta o seu próprio Y, mas pares de pixels adjacentes partilham um U e um V. O esquema de bytes para cada par são quatro bytes – Y0, U, Y1, V – o que resulta em média em dois bytes por pixel, idêntico ao RGB565.
Os dois bytes têm significados diferentes dos do RGB565. O canal Y sozinho é uma imagem em escala de cinzentos de 8 bits pronta a usar, que é o que a maioria dos algoritmos clássicos de visão por computador (deteção de arestas, correspondência de modelos, análise de manchas) consome efetivamente; os canais U e V transportam a informação de cor para o pequeno número de algoritmos que dela necessitam.
YUV422 é a escolha certa quando o pipeline necessita de ambos – um algoritmo numa fase inicial que lê apenas Y seguido de uma fase posterior que usa a croma para decisões de cor mais precisas – porque os valores de Y estão ali disponíveis prontos a usar sem conversão de espaço de cor.
4.13.5. Escala de cinzentos¶
A escala de cinzentos é um byte por pixel: apenas o valor de luminância, sem cor alguma. É o menor formato concluído – metade do tamanho do RGB565 e YUV422, um terço do tamanho do RGB888.
A maioria dos algoritmos clássicos de visão por computador trabalha de qualquer forma em escala de cinzentos, pelo que descartar o canal de cor diretamente no sensor é frequentemente a escolha mais simples e eficiente em memória. A deteção de arestas, a deteção de linhas, a análise de manchas, a descodificação de códigos QR, a correspondência de modelos e a deteção de AprilTag funcionam todas em escala de cinzentos e beneficiam do buffer mais pequeno.
4.13.6. Outros formatos¶
Alguns formatos que o OpenMV Cam pode produzir não saem do pipeline do ISP como parte do fluxo normal.
BINARY é um bit por pixel – a menor representação possível. Utilizado para imagens com limiarização, buffers de máscara e a saída de qualquer operação que distinga apenas entre correspondência e não correspondência em cada pixel.
JPEG é um formato de cor comprimido. Alguns sensores incluem um codificador JPEG integrado no chip e podem entregar fotogramas comprimidos em JPEG diretamente; para sensores sem ele, o MCU executa um codificador JPEG sobre um fotograma RGB ou em escala de cinzentos concluído após o ISP. De qualquer forma, a saída é um fluxo de bits JPEG, útil para guardar fotogramas em armazenamento ou enviá-los por uma ligação com largura de banda limitada.
PNG é um formato comprimido sem perdas. Os sensores não produzem PNG diretamente; o MCU comprime um fotograma RGB ou em escala de cinzentos concluído a pedido. Útil quando a largura de banda ou o armazenamento são importantes, mas a compressão com perdas que o JPEG aplica descartaria informação de que a aplicação precisa posteriormente.