Compactando muitas imagens grandes semelhantes?

Compactando muitas imagens grandes semelhantes?

Estou lidando com um grande arquivo de imagens de satélite da Terra, cada uma tirada com 15 minutos de intervalo na mesma área, portanto são bastante semelhantes entre si. Dois contíguos têm esta aparência: insira a descrição da imagem aqui

Algoritmos de vídeo funcionam muito bem na compactação de várias imagens semelhantes. No entanto, essas imagens são muito grandes para vídeo (10848x10848) e o uso de codificadores de vídeo excluiria os metadados das imagens, portanto, extraí-los e restaurá-los seria complicado, mesmo se eu conseguisse um codificador de vídeo para trabalhar com imagens tão grandes.

Para fazer alguns testes reduzi as 96 imagens de um dia para 1080x1080 pixels, totalizando 40,1MB e tentei compactações diferentes com os seguintes resultados:

  1. zip: 39,8 MB
  2. rar: 39,8MB
  3. 7z: 39,6MB
  4. tar.bz2: 39,7 MB
  5. zpaq v7.14: 38,3 MB
  6. fp8 v2: 32,5 MB
  7. paq8pxd v45:30,9MB

Os três últimos supostamente aproveitam muito melhor o contexto e, de fato, funcionam melhor que a compactação tradicional, mas a taxa de compactação ainda é muito baixa em comparação com o vídeo mp4, que pode chegar a 15 MB ou até menos, preservando a qualidade da imagem.

No entanto, nenhum dos algoritmos usados ​​por esses utilitários de compressão parece tirar vantagem da semelhança das imagens como a compressão de vídeo faz. Na verdade, usandopacoteJPG, que comprimem cada imagem separadamente, o conjunto todo cai para 32,9 MB, bem próximo de fp8 e paq8pxd mas sem tirar vantagem das semelhanças entre as imagens (porque cada imagem é comprimida individualmente).

Em outro experimento, calculei no Matlab a diferença das duas imagens acima, e ficou assim:

insira a descrição da imagem aqui

Compactar ambas as imagens originais (219,5 + 217,0 = 436,5 kB no total) com fp8 reduzi-las para 350,0 kB (80%), mas compactar uma delas e a imagem diferente (como um jpg da mesma qualidade e usando 122,5 kB), resulta em um arquivo de 270,8 kB (62%), então novamente (conforme revelado pela comparação entre mp4 e packJPG), o fp8 não parece tirar muita vantagem das semelhanças. Mesmo compactado com rar, uma imagem mais a diferença tem um desempenho melhor que fp8 nas imagens originais. Nesse caso, o rar reduz para 333,6 kB (76%).

Acho que deve haver uma boa solução de compactação para esse problema, pois posso imaginar muitos aplicativos. Além do meu caso específico, acho que muitos fotógrafos profissionais têm muitas fotos semelhantes devido a disparos sequenciais, ou imagens com lapso de tempo, etc. Todos os casos que se beneficiariam com tal compactação.

Além disso, não preciso de compactação sem perdas, pelo menos não para os dados da imagem (os metadados devem ser preservados).

Então... Existe um método de compactação que explora as semelhanças entre as imagens compactadas?

As duas imagens do teste acima podem ser baixadasaqui, e as 96 imagens do primeiro testeaqui.

Responder1

Não conheço nenhum software específico que faça isso, mas existem algumas pesquisas sobre o assunto. Por exemplo, veja os artigosCompactando conjuntos de imagens semelhantespor Samy Ait-Aoudia, Abdelhalim Gabis, Amina Naimi eCompactando conjuntos de imagens semelhantes usando modelo de compactação híbridapor Jiann-Der Lee, Shu-Yen Wan, Chemg-Min Ma, Rui-Feng Wu.

Em um nível mais prático, você poderia estender sua técnica de subtração, por exemplo, escrevendo um script que usaImagemMagickpara calcular a diferença entre imagens consecutivas, salvando o resultado como um jpeg (ou um png compactado, se desejar sem perdas). Você obterá uma imagem base e um conjunto de imagens "delta" compactadas que devem ser muito menores. Para calcular a diferença usando ImageMagick:

convert image2.png image1.png -compose MinusSrc -composite -depth 24 -define png:compression-filter=2 -define png:compression-level=9 -define png:compression-strategy=1 difference-2-1.png

Para recalcular adicionando de volta:

convert image1.png difference-2-1.png -compose Plus -composite image2-reconstructed.png

(Você pode fazer o mesmo usando jpg e economizar muito espaço).

Responder2

Na esperança de que outras pessoas queiram compactar imagens/PNGs semelhantes e encontrem o caminho até aqui por meio de pesquisas:

Não tenho certeza de como o caso de uso em que trabalhei na comparação se aplicaria às fotografias operacionais, pois o link não funciona mais. Meu caso de uso era semelhante, mas não o mesmo - eu estava procurando compactar capturas de tela de programas de computador muito semelhantes, potencialmente muito mais compactáveis ​​do que apenas compactar os arquivos PNG. Não consegui encontrar nenhuma solução através da pesquisa, então criei a minha própria e acabei com uma taxa de compactação insana de 4,4% (em oposição a 96% através do uso ingênuo de simplesmente compactar os PNGs):

Meu conjunto de dados era de 300 arquivos PNG em 1920x1080, com um tamanho bruto de 431,8 MB que foi compactado para apenas 417,4 MB com as melhores configurações que pude encontrar para bz2, 7z e ferramentas semelhantes. Meu entendimento é que os arquivos de origem não foram compactados de maneira ideal no nível PNG, pois várias ferramentas de minimização de PNG conseguiram reduzir o tamanho bruto de cerca de 1,4 MB para 900 KB por arquivo.

Meu pensamento era que o problema era que as ferramentas de compactação não conseguiam descobrir que os dados já estavam compactados e que pequenas alterações nos dados brutos poderiam levar a arquivos compactados muito diferentes. Então descompactei os arquivos usando ffmpegconfigurações que, no meu entender, não resultam em perda de dados:

for FILE in screenshot-2024*; do ffmpeg -loglevel error -i $FILE -vframes 1 -compression_algo raw -pix_fmt rgb24 $FILE.tiff; done

Isso aumentou os tamanhos de arquivo individuais de 1,4 para 6 MB, mas a compactação com 7z/LZMA2 levou a um arquivo resultante com um tamanho incrivelmente baixo de 19.175.127 bytes, o que significa uma compactação de apenas 4,4% do tamanho original.

A reconversão dos .tiffarquivos para .pngpode ser feita com:

for FILE in screenshot-2024*.tiff; do ffmpeg -loglevel error -i $FILE $FILE.png; done

É claro que os finais de arquivo duplicados podem ser corrigidos, mas dessa forma não substituirão suas fontes originais durante o teste.

As configurações que usamos para compactação foram as seguintes; com a Solid block sizeconfiguração aparentemente tendo o maior efeito no tamanho da saída:

  • Nível de compressão: 9/Ultra
  • Método de compressão: LZMA2
  • Tamanho do dicionário: 512 MB
  • Tamanho da palavra: 256
  • Tamanho do bloco sólido: 512 MB
  • Uso de memória para compactação: 12 GB

Como para nós o objetivo era o armazenamento de longo prazo, os aros adicionais e o tempo de compactação não foram um grande fator, é claro, sua milhagem pode variar.

informação relacionada