Compactação de imagem simples, sem streaming e sem perdas

8

Alguém conhece alguma técnica de compressão de imagem com as seguintes características:

  • sem perdas
  • streaming - quero compactar em tempo real, pixel por pixel.
  • sobrecarga de pouca memória - posso me permitir armazenar em buffer uma única linha, mas, idealmente, nem isso.
  • sem dicionários dinâmicos
  • apenas imagens do "mundo real", portanto, o desempenho em "casos desagradáveis" como tabuleiros de xadrez não é importante
  • Compressão de 2-3x (5x-10x seria ainda melhor, mas isso é pedir muito, eu sei)
  • pode operar em pixels de 10 a 16 bits (dependendo da minha câmera)

Minhas imagens terão ~ 1k pixels de largura, com taxas de pixels de ~ 20Mpix / s. A profundidade do pixel será algo entre 10 e 16 bits por pixel (dependendo da escolha da câmera). Suponha que larguras de pixel de sub-16 bits sejam representadas em uma palavra de 16 bits por enquanto, em vez de precisar ser extraído de um fluxo de bits contínuo.

Alguma forma de codificação delta + aritmética, talvez?

Martin Thompson
fonte
Seus pixels de 10 a 16 bits estão sempre preenchidos, digamos, 16 bits ou estão compactados?
Paul R
11
Parece que não há muitos requisitos específicos de imagem lá. Correndo o risco de parecer óbvio, você já pensou em experimentar um algoritmo de compactação de dados de streaming padrão, como zlib, LZMA, etc.?
Jason R
@PaulR - pergunta atualizada - os pixels serão preenchidos.
Martin Thompson
@JasonR: Eu fiz um pouco de investigação sobre técnicas "padrão", mas minha impressão (possivelmente imprecisa?) É que elas parecem muito dinâmicas e com muita memória (em relação ao meu critério "até 1K aumenta")
Martin Thompson
11
o huffyuv mencionado abaixo é bastante semelhante à sua sugestão 'delta + aritmética'. Embora obviamente use huffman em vez de codificação aritmética para a parte de codificação da entropia. em 8 bits / pixel, atinge tipicamente um pouco acima da compressão 2x, com apenas 1 buffer de linha.
Sr. White

Respostas:

4

Você pode usar o Huffyuv: http://neuron2.net/www.math.berkeley.edu/benrg/huffyuv.html

Isso não é muito melhor do que um zip simples, mas ainda é um pouco otimizado para imagens.

Qualquer compressão relacionada à imagem vem de técnicas como quantização vetorial ou codificação Transform. Para fazer uso de transformações como DCT / Wavelet e torná-las sem perdas, você pode pensar em JPEG-LS ou JPEG2000 para compactação. A única coisa é que não está fluindo no seu sentido de definição.

Dipan Mehta
fonte
11
Huffyuv requer apenas um buffer de linha; sua técnica de correlação espacial (o preditor mediano) é, portanto, simples. Para taxas de compactação mais altas, um bom preditor espacial é fundamental. Espere que a quantidade necessária de buffers de linha suba significativamente. DCT / Wavelet por exemplo, requer entre 4 e 8, linhas de, pelo menos, a fim de obter melhores resultados do que Huffyuv
Sr. White
2

Parece com o que você colocaria em uma câmera digital para obter um RAW sem perdas.

1 / Verifique o código fonte do dcraw para ver o que vários fabricantes de câmeras já estão fazendo. Por exemplo, o Pentax usa algum esquema int de comprimento variável (comprimento N codificado com um código de huffman, depois N bits) para codificar o delta de um pixel com o pixel anterior da mesma cor no mosaico da Bayer; e isso atinge rotineiramente proporções de 1: 1,5 a 1: 2.

Os arquivos 2 / DNG também podem ser compactados. Verifique como é feito a partir das especificações da Adobe ... Não tenho certeza se é baseado em uma previsão semelhante + codificação int de comprimento variável (que está sendo transmitida); ou se ele usa o JPEG-LS mais avançado baseado em LOCO (e que infelizmente exige várias passagens nos dados).

pichenettes
fonte
1

O zlib possui um modo de compactação ("HUFFMAN_ONLY") que é rápido e não requer muita memória. Para fotos típicas usando zlib com libpng, recebo taxas de compressão de 1: 2. Você pode experimentá-lo com ImageMagick, GraphicsMagick ou pngcrush.

convert input.ppm -quality 1 output_im.png
gm convert input.ppm -quality 1 output_gm.png
pngcrush -force -m 12 input.png output_pc.png

Todos esses exemplos usam o filtro "sub" (1) PNG, que é eficaz para fotos. Para * Magick, "-quality 1" e para pngcrush, "-m 12" significa usar o filtro "sub" e a compressão "huffman_only".

Glenn Randers-Pehrson
fonte