Cor indexada

Na computação, a cor indexada é uma técnica para gerenciar as cores das imagens digitais de forma limitada, a fim de economizar memória do computador e armazenamento de arquivos, enquanto aceleram a atualização e as transferências de arquivos. É uma forma de compactação de quantização vetorial.

Quando uma imagem é codificada dessa maneira, as informações de cores não são transportadas diretamente pelos dados de pixels da imagem, mas são armazenadas em um dado separado chamado paleta: uma matriz de elementos de cor. Cada elemento na matriz representa uma cor, indexada pela sua posição dentro da matriz. As entradas individuais às vezes são conhecidas como registros de cores. Os pixels da imagem não contêm a especificação completa de sua cor, mas apenas seu índice na paleta. Esta técnica às vezes é referida como cor pseudocolor ou indireta, pois as cores são direcionadas indiretamente.

Talvez o primeiro dispositivo que suportasse cores de paleta fosse um buffer de quadro de acesso aleatório, descrito em 1975 por Kajiya, Sutherland e Cheadle. Isso suportou uma paleta de 256 cores RGB de 36 bits.

Tamanho da paleta
A própria paleta armazena um número limitado de cores distintas; 4, 16 ou 256 são os casos mais comuns. Esses limites são muitas vezes impostos pelo hardware do adaptador de exibição da arquitetura de destino, portanto, não é coincidência que esses números sejam poderes exatos de dois (o código binário): 22 = 4, 24 = 16 e 28 = 256. Enquanto 256 valores podem ser se encaixa em um único byte de 8 bits (e, em seguida, um único pixel de cor indexado também ocupa um único byte), os índices de pixels com 16 (4 bits, um nibble) ou menos cores podem ser compactados em um único byte (dois nibbles por byte, se forem utilizadas 16 cores ou quatro pixels de 2 bits por byte se estiver usando 4 cores). Às vezes, podem ser usados ​​valores de 1 bit (2 cores), e então até oito pixels podem ser empacotados em um único byte; essas imagens são consideradas imagens binárias (às vezes referidas como uma imagem de bitmap ou bilevel) e não uma imagem de cor indexada.

Se a sobreposição de vídeo simples se destina através de uma cor transparente, uma entrada de paleta é especificamente reservada para esse propósito, e é descontada como uma cor disponível. Algumas máquinas, como a série MSX, tinham a cor transparente reservada pelo hardware.

As imagens de cores indexadas com tamanhos de paleta além de 256 entradas são raras. O limite prático é de cerca de 12 bits por pixel, 4,096 índices diferentes. Para usar indexado 16 bpp ou mais não fornece os benefícios da natureza das imagens coloridas indexadas, devido ao tamanho da paleta de cores em bytes sendo maior que o próprio dado de imagem em bruto. Além disso, os modos Direct High RGB diretos podem ser usados ​​a partir de 15 bpp e para cima.

Se uma imagem tiver muitas máscaras de cores sutis, é necessário selecionar um repertório de cores limitado para aproximar a imagem usando a quantificação de cores. Essa paleta é freqüentemente insuficiente para representar a imagem com precisão; características difíceis de reproduzir, como gradientes, aparecerão bloqueadas ou como tiras (faixa de cores). Nesses casos, é costume empregar dithering, que mistura pixels de diferentes cores em padrões, explorando a tendência da visão humana para desfocar os pixels próximos, dando um resultado visualmente mais próximo do original.

Cores e paletas
Como as cores são codificadas dentro do mapa da paleta de cores de uma determinada imagem de cor indexada, depende da plataforma alvo.

Técnicas de cor precoce
Muitos primeiros computadores pessoais e domésticos tinham paletas de hardware muito limitadas que poderiam produzir um conjunto muito pequeno de cores. Nesses casos, o valor de cada pixel é mapeado diretamente em uma dessas cores. Exemplos bem conhecidos incluem o Apple II, Commodore 64 e IBM PC CGA, todos os quais incluíram hardware que poderia produzir um conjunto fixo de 16 cores. Nesses casos, uma imagem pode codificar cada pixel com 4 bits, selecionando diretamente a cor para usar. Na maioria dos casos, no entanto, o hardware de exibição suporta modos adicionais onde apenas um subconjunto dessas cores pode ser usado em uma única imagem, uma técnica útil para economizar memória. Por exemplo, o modo de resolução 320 x 200 da CGA pode mostrar apenas quatro das 16 cores ao mesmo tempo. Como as paletas eram totalmente proprietárias, uma imagem gerada em uma plataforma não pode ser diretamente vista corretamente em outra.

Outras máquinas desta época tiveram a capacidade de gerar um conjunto maior de cores, mas geralmente só permitiram que um subconjunto daqueles fossem usados ​​em qualquer imagem. Os exemplos incluem a paleta de 256 cores em máquinas Atari de 8 bits ou as 4.096 cores do terminal VT241 no modo gráfico ReGIS. Nesses casos, era comum que a imagem permitia apenas que um pequeno subconjunto do número total de cores fosse exibido ao mesmo tempo, até 16 de uma vez no Atari e VT241. Geralmente, esses sistemas funcionavam de forma idêntica aos seus irmãos menos coloridos, mas uma diferença fundamental era que havia muitas cores na paleta para codificar diretamente nos dados de pixels, dada a quantidade limitada de memória de vídeo. Em vez disso, eles usaram uma tabela de pesquisa de cores (CLUT), onde os dados de cada pixel apontaram para uma entrada no CLUT e o CLUT foi configurado no controle do programa. Isso significava que os dados da imagem CLUT deveriam ser armazenados juntamente com os dados da imagem em bruto para poder re-produzir a imagem corretamente.

RGB
As paletas de hardware com base em cores de componentes de vídeo, como YPbPr ou similares, geralmente foram substituídas em meados da década de 1980 pelo modelo de cores RGB mais flexível, no qual uma determinada cor pode ser obtida misturando diferentes quantidades das três cores primárias vermelho, verde e azul. Embora o número total de cores diferentes dependa do número de níveis por primário e de uma implementação de hardware dada (um RGB de 9 bits oferece 512 combinações, um RGB de 12 bits fornece 4,096 e assim por diante), neste modelo Digital- to-Analog Converters (DAC) pode gerar as cores – simplificando o design do hardware – enquanto o software pode tratar o número por níveis usados ​​de forma abstrata e gerenciar as cores RGB de forma independente do dispositivo. Com as cores armazenadas em formato RGB dentro das paletas dos arquivos de imagens indexadas, qualquer imagem pode ser exibida (através de transformações apropriadas) em qualquer desses sistemas, independentemente da profundidade de cor usada na implementação do hardware.

Hoje, exibir hardware e formatos de arquivos de imagem que lidam com imagens de cores indexadas quase exclusivamente gerenciam cores em formato RGB, sendo a codificação padrão de facto a chamada truecolor ou RGB de 24 bits, com 16,777,216 cores diferentes possíveis. No entanto, as imagens de cores indexadas não são genuinamente restritas a uma codificação de cor RGB de 24 bits; As paletas de imagem podem conter qualquer tipo de codificação de cores. Por exemplo, o formato de arquivo PDF suporta cores indexadas em outros espaços de cores, especialmente CMYK e Adobe Distiller, por padrão, converterá imagens em cores indexadas sempre que o número total de cores em uma imagem for igual ou inferior a 256. Ao usar o RGB, os formatos de arquivo TIFF e PNG podem, opcionalmente, armazenar as objectivas RGB com uma precisão de 16 bits (65,536 níveis por componente), obtendo um total de 48 bits por pixel. Uma extensão proposta para o padrão TIFF permite paletas de cores não RGB, mas isso nunca foi implementado em software devido a razões técnicas. A tabela de mapa de cores do modo de cor indexada ao formato de arquivo BMP armazena suas entradas na ordem BGR em vez de RGB e tem (na versão atual) um byte adicional não utilizado para o preenchimento para se adequar ao alinhamento de palavras de 32 bits durante o processamento, mas é essencialmente ainda uma codificação de cor RGB de 24 bits. (Uma versão anterior do formato BMP usou três bytes por entrada de tabela de mapa de cores de 24 bits e muitos arquivos nesse formato ainda estão em circulação, muitos programas modernos que lêem arquivos BMP suportam ambas as variações.)

Arranjos de bits de pixels
Exceto por modos gráficos de muito baixa resolução, computadores iniciais e pessoais raramente implementaram um design “abordável em todos os pixels” – isto é, a capacidade de mudar um único pixel para qualquer uma das cores disponíveis de forma independente. Suas limitações vieram do uso de atributo de cor diferente ou áreas de RAM de cor, levando a efeitos de conflito de atributos. Além disso, os bits de pixel e / ou as linhas de varredura da memória de vídeo foram comumente organizados de maneiras estranhas, convenientes para o hardware do gerador de vídeo (economizando assim os custos de hardware em um mercado com custo competitivo), mas às vezes criam dificuldades para as pessoas que escrevem programas gráficos . Os bits de um pixel em imagens de cores indexadas, todas pixel-endereçáveis ​​nem sempre são contíguos na memória de vídeo ou arquivos de imagem (ou seja, a organização robusta nem sempre é usada). Alguns hardware de vídeo, como os modos gráficos de 16 cores do Enhanced Adaptador de Gráficos (EGA) e Video Graphics Array (VGA) para IBM PC compatíveis ou o buffer de vídeo Amiga estão dispostos como uma série de planos de bits (em uma configuração chamada planar), nos quais os bits relacionados de um único pixel são divididos entre vários bitmaps independentes. Assim, os bits de pixel são alinhados conceitualmente ao longo do eixo Z 3D. (O conceito de “profundidade” aqui não é o mesmo que o da profundidade de pixels).

Os primeiros formatos de arquivos de imagem, como o PIC, armazenados pouco mais do que um despejo de memória do buffer de vídeo de uma determinada máquina.

Alguns formatos de arquivo de imagem em cores indexadas, como o formato de intercâmbio gráfico (GIF), permitem que as linhas de varredura da imagem sejam organizadas de forma intercalada (não uma ordem linear), o que permite que uma versão de baixa resolução da imagem apareça na tela enquanto ainda está sendo baixada , para que o usuário do computador possa ter uma idéia do seu conteúdo durante os segundos antes da chegada da imagem inteira.

Como visto aqui, a imagem foi dividida em quatro grupos de linhas: o grupo A contém todas as quatro linhas, o grupo B contém linhas imediatamente após as do grupo A, o grupo C contém as linhas imediatamente seguindo as do grupo B e o grupo D contém as linhas restantes, que estão entre as linhas do grupo C (imediatamente acima) e as linhas do grupo A (imediatamente abaixo). Estes são armazenados no arquivo na ordem A, C, B, D, de modo que quando o arquivo é transmitido, o segundo grupo recebido (C) de linhas está centrado entre as linhas do primeiro grupo, produzindo o mais espacialmente uniforme e reconhecível imagem possível, composta de apenas dois dos grupos de linhas. A mesma técnica pode ser aplicada com mais grupos (por exemplo, oito), caso em que cada etapa a ser enviada contém linhas que estão localizadas em ou perto dos centros das faixas restantes que ainda não estão preenchidas com dados de imagem. Este método, com quatro ou oito grupos de linhas, foi comumente usado na World Wide Web precoce durante a segunda metade da década de 1990. Em vez de deixar o plano de fundo (preto) mostrando como na ilustração acima, a imagem parcial foi frequentemente apresentada na tela, duplicando cada linha para preencher o espaço abaixo da próxima linha de imagem recebida. O resultado final foi uma imagem contínua com resolução vertical diminuída que aumentaria a resolução total ao longo de alguns segundos à medida que as partes mais recentes dos dados da imagem chegassem.

Vantagens
A cor indexada economiza muita memória, espaço de armazenamento e tempo de transmissão: usando truecolor, cada pixel precisa de 24 bits ou 3 bytes. Uma resolução típica de 640 x 480 VGA, a imagem descompactada truecolor, precisa de 640 × 480 × 3 = 921,600 bytes (900 KiB). Limitando as cores da imagem a 256, cada pixel precisa apenas de 8 bits, ou 1 byte cada, de modo que o exemplo de imagem agora precisa apenas de 640 × 480 × 1 = 307,200 bytes (300 KiB), mais 256 × 3 = 768 bytes adicionais para armazenar o mapa de paleta em si (assumindo RGB), aproximadamente um terço do tamanho original. As paletas menores (4 cores de 16 bits, 2 cores de 4 bits) podem conter os pixels ainda mais (para um sexto ou um décimo segundo), obviamente, com o custo da precisão da cor.

A cor indexada foi amplamente utilizada nos primeiros computadores pessoais e no hardware dos adaptadores de exibição para reduzir custos (principalmente por exigir menos chips de RAM então caros), mas também para gerenciamento de imagem conveniente com CPUs de potência limitada (da ordem de 4 a 8 MHz ), armazenamento de arquivos (fitas cassete e disquetes de baixa densidade). Os sistemas de computação gráfica notáveis ​​amplamente (ou mesmo exclusivamente) usando paletas pseudocolor na década de 1980 incluem CGA, EGA e VGA (para IBM PC compatíveis), o Atari ST e o OCS e AGA da Amiga.

Os arquivos de imagens trocados pela rede Compuserve no início da década de 1990 foram encapsulados no formato GIF. Mais tarde, as páginas da Web HTML usaram o GIF juntamente com outros formatos de arquivos compatíveis com cores indexados, como o PNG, para trocar imagens de cores limitadas rapidamente e armazená-las em espaço de armazenamento limitado.

A maioria dos formatos de arquivo de imagem que suportam imagens coloridas indexadas também suportam geralmente algum esquema de compressão, aumentando sua capacidade de armazenar as imagens em arquivos menores.

Efeitos coloridos e artísticos interessantes podem ser facilmente alcançados alterando a paleta de cores de imagens de cores indexadas, por exemplo, para produzir imagens de tons de sepia coloridos. Devido à natureza separada do elemento de paleta associado das imagens de cores indexadas, eles são ideais para remapear imagens de escala de cinza em cores falsas através do uso de paletas de cores falsas.

A superposição de vídeo simples pode ser conseguida facilmente através da técnica de cores transparente.

Ao manipular os registros de hardware de cores (tabela de consulta de cores ou CLUT) do adaptador de exibição nos modos de gráfico de cores indexados, os efeitos de animação de cores em tela cheia podem ser obtidos sem redessinar a imagem – isto é, com baixo custo de tempo de CPU; uma única alteração dos valores do registro afeta toda a tela ao mesmo tempo. A animação do mapa de cores, também conhecida como Ciclo de cores, é amplamente utilizada no demoscene. A tela do logotipo de inicialização do Microsoft Windows em Windows 95, 98, ME e 2000 Professional (que usa o modo de exibição a cores VGA 320x200x256 porque é o maior denominador comum em todos os PCs) emprega esta técnica para a barra de gradiente de rolagem na parte inferior da tela ; a imagem é uma imagem estática sem pixels reescritos depois que ela é inicialmente exibida. Imagens de tela de inicialização personalizadas podem tocar as cores de ciclos para animar outras partes das imagens.

Desvantagens
A principal desvantagem de usar cor indexada é o conjunto limitado de cores simultâneas por imagem. As pequenas paletas de 4 ou 16 cores ainda são aceitáveis ​​para pequenas imagens (ícones) ou gráficos muito simples, mas para reproduzir imagens da vida real tornam-se quase inúteis. Algumas técnicas, como a quantificação de cores, o anti-aliasing e o dithering combinados, podem criar imagens indexadas de 256 cores comparáveis ​​ao original até um nível aceitável.

As imagens de cores indexadas dependem fortemente de suas próprias paletas de cores. Exceto por algumas paletas de cores fixas bem conhecidas (como a do Color Graphics Adapter-CGA), as imagens de imagem em bruto e / ou as tabelas de mapa de cores não podem ser trocadas de forma confiável entre diferentes arquivos de imagem sem algum tipo de mapeamento intermediário. Além disso, se a paleta de cores original para uma determinada imagem indexada for perdida, pode ser quase impossível restaurá-la. Aqui está um exemplo do que acontece quando uma imagem de cor indexada (o papagaio anterior) foi associada a uma paleta de cores incorreta:

Os modos de gráfico de cores indexados para adaptadores de exibição têm o limite de cores de 16 ou 256 impostas pelo hardware. As imagens de cores indexadas com paletas ricas mas incompatíveis só podem ser exibidas com precisão uma de cada vez, como em uma apresentação de slides. Quando é necessário mostrar várias imagens em conjunto, como em um mosaico de miniaturas, uma paleta comum ou mestre é freqüentemente usada, que engloba tantas cores diferentes quanto possível em um único conjunto, limitando assim a disponibilidade de cor precisa.

A seguinte imagem é um mosaico de quatro imagens de cores indexadas diferentes renderizadas com uma única paleta mestre compartilhada de 6-8-5 níveis RGB mais 16 grays adicionais. Observe a gama limitada de cores usadas para cada imagem e quantas entradas de paleta não são utilizadas.

Mosaico de amostra de cores indexadas não atinge o limite de 24 bits para a paleta RGB completa. O VGA para IBM PC compatíveis, por exemplo, fornece apenas uma paleta RGB de 18 bits com 262,144 cores possíveis em ambos os modos gráficos a cores indexados em 16 e 256.
Algum software de edição de imagem permite que a correção gama seja aplicada a uma paleta para arquivos de imagens em cores indexados. Em geral, aplicar uma correção de gama diretamente ao mapa de cores é uma má prática, devido ao perda de valores de cor RGB originais. É melhor aplicar a correção de gama com o hardware de exibição (a maioria dos adaptadores de tela modernos suportam esse recurso) ou como um passo intermediário ativo do software de renderização através do gerenciamento de cores, que preserva os valores de cores originais. Somente quando as imagens de cores indexadas são destinadas a sistemas que não possuem qualquer tipo de calibração de cores, e não se destinam a ser de plataforma cruzada, a correção de gama pode ser aplicada à própria tabela de cores.