O GDAL deve ser definido para produzir arquivos GeoTIFF com compactação? Qual algoritmo deve ser usado?


51

Eu tenho uma pasta de dados GIS que consiste principalmente em arquivos GeoTIFF. Todo o conjunto pesa cerca de 1.2 GB. Percebi que se eu empacotar o conteúdo em um tarball, ele se esmaga 82 MB. Gostaria de verificar o conjunto em um sistema de controle de revisão para que ele possa ser trabalhado por outras pessoas e parece que há algum espaço que pode ser espremido.

A página do driver GDAL GeoTIFF lista muitas opções que podem ser usadas para criar arquivos GeoTIFF compactados. Também existem muitas opções que afetam a maneira como cada algoritmo funciona.

A página de ajuda faz um bom trabalho na descrição das opções, mas não detalha como selecionar um algoritmo ou as trocas associadas ao nível variável de compactação. Isso leva às seguintes perguntas:

  • Os profissionais do uso de compactação são uma economia drástica no espaço. Quais são os contras? As informações são perdidas quando a imagem é compactada?

  • Como se deve escolher um algoritmo e um nível de compactação. Alguns tipos de imagens se prestam a um determinado algoritmo?

Respostas:


86

Para selecionar o método de compactação, você precisa usar um comando como:

gdal_translate -co "COMPRESS=method" src_dataset dst_dataset

Quando você usa a compactação, a maior compensação é o tempo extra de processamento necessário para descompactar a imagem e, após descompactar, a imagem ainda consumirá a mesma quantidade de memória. Sobre a perda de informações, existem dois tipos básicos de compactação :

  • sem perdas - que preservam os valores originais dos dados
  • com perdas - que degradam os dados para economizar ainda mais espaço

Você usaria algoritmos sem perdas quando os valores dos dados originais devem ser preservados, como DEMs ou recursos de varredura. Algoritmos como PACKBITS , DEFLATE e LZW não têm perdas e podem ser ordenados de acordo com a taxa de compressão:

  1. LZW - maior taxa de compressão, maior poder de processamento
  2. DEFLATE
  3. PACOTES - menor taxa de compressão, menor poder de processamento

A taxa de compressão ainda depende dos dados, se os dados tiverem muitos valores semelhantes, PACKBITS produzirá bons resultados.

Ao contrário de sem perdas, você usaria algoritmos com perdas, como JPEG, para comprimir rasters que não precisam retornar valores exatos. Por exemplo, ortofotos ou imagens de satélite podem ser compactadas usando algoritmos com perdas.


5
+1 para a boa resposta. PACKBITS é uma forma de codificação de execução ( en.wikipedia.org/wiki/Run-length_encoding ) que funcionará bem para dados com muitos valores iguais adjacentes (se, por exemplo, você tiver muitos NULLs ou uma varredura classificada) e O LZW é um algoritmo mais robusto, eficaz em mais tipos de dados. A troca geral é entre espaço e velocidade, conforme mencionado, portanto, o que é apropriado depende do uso e dos dados. Além disso, alguns softwares não suportam certos tipos de compactação GeoTiff.
ACS

3
esta é uma publicação boa e relevante linfiniti.com/2011/05/…
oeon

11
Boa resposta, resume bem suas opções. Lembre-se também de que cada um desses métodos de compactação possui parâmetros que você pode definir, o que influenciará consideravelmente o resultado. @ j03lar50n, que bom que você achou meu artigo útil ...
R Thiede

linda resposta! tão simples e direto ao ponto.
precisa saber é o seguinte

@scw, você poderia dizer mais sobre qual software não suporta certos tipos de compactação - especificamente, existe algum software que não suporte lzw ou packbits? Ou você está se referindo principalmente a algoritmos menos comuns?
David LeBauer 31/01

29

O uso de lzwe deflatecompressão -co predictor=2pode ajudar com imagens que variam suavemente à medida que comprime as diferenças de pixel para pixel em vez dos valores absolutos, e elas tendem a ser pequenas e ter mais padrões ( ref ). O Predictor é útil apenas com lzwe deflatecompressão, a opção não tem efeito com outros métodos.

gdal_translate -co compress=lzw -co predictor=2 ...

A economia de previsão pode ser dramática. Acabei de compactar novamente um diretório de modelos de elevação geotiff de 16 bits usando 17 GB com as configurações padrão de LZW em apenas 5 GB com preditor = 2.

Há informações conflitantes sobre as diferenças entre os preditores 2 e 3 e quando cada um é melhor aplicado ( ref1 , ref2 ). Talvez combustível para outra pergunta.

Outra opção fácil para economizar é -co tiled=yes. Existem alguns softwares que não conseguem ler imagens lado a lado, mas elas estão se tornando mais raras e principalmente fora do GIS (agora não conheço nenhum software GIS de fluxo principal que não as leia).

Para aproveitar a resposta da @ alfonx de usar visões gerais compactadas : Isso permite que a imagem base seja armazenada sem perdas, para integridade dos dados, e as pirâmides com perdas, para velocidade e economia de espaço. É quase o melhor dos dois mundos. Para as menores visões gerais possíveis com gdaladdoimagens RGB: use compactação jpeg, reamostragem média ou gaussiana em vez do vizinho mais próximo padrão (torna as visões mais suaves) e visão geral fotométrica YCBCR. Veja a página de referência do gdaladdo para obter mais informações sobre essas opções (embora não diga muito sobre o que é fotométrica).

Isso faz parte de um arquivo em lotes do Windows que eu uso para aplicar visões gerais de JPEG externas a todos os tiffs em um diretório:

set _opts= -r gauss --config PHOTOMETRIC_OVERVIEW YCBCR ^
--config COMPRESS_OVERVIEW JPEG --config JPEG_QUALITY_OVERVIEW 85

for %%a in (*.tif) do gdaladdo -ro %_opts% %%a 2 4 8 16 32 64

Notas

O GDAL 1.6.0 introduziu a gaussreamostragem que pode levar a melhores resultados averageno caso de bordas afiadas com alto contraste ou padrões de ruído. Poderes de 2 níveis (2 4 8 ...) devem ser usados ​​para que um núcleo Gaussiano de reamostragem 3x3 seja selecionado.

JPEG_QUALITY_OVERVIEW 85 - se não especificado, o padrão de 75% é usado, o que gera um arquivo menor, mas considero 85% um comprometimento melhor na troca de tamanho versus qualidade.

Atualização, 2015: GDAL 1.8 e 2.0 introduziram muitas novas opções não abordadas aqui e que não tive tempo de digerir. Leia a página oficial do formato gtiff , tenho certeza de que há configurações úteis adicionais detalhadas.


10

Para grandes empresas, o GeoTiff oferece a possibilidade de armazenar visões gerais (pré-) reduzidas como imagens extras no arquivo GeoTiff. Isso pode ser feito com gdaladdo (= Visão geral do GDAL ADD). Ao criar essas visões gerais, você pode dizer manualmente ao gdal para compactá-las também:

gdaladdo --config COMPRESS_OVERVIEW JPEG 

Acelera a visualização de seus dados sem adicionar muito tamanho. Nota: Aplicativos Geotools como Geoserver, uDig, AtlasStyler, Geopublisher podem usar esse recurso e lucrar com as visões gerais.



4

Por fim, você provavelmente precisará experimentar as diferentes opções e ver o que atende às suas necessidades.

Eu uso cada vez mais GeoTIFFs compactados em JPEG sobre formatos baseados em wavelet. Meus resultados foram muito bons. O uso do GDAL para isso resultou em taxas de compactação comparáveis ​​aos formatos baseados em wavelet sem muita perda de dados. O impacto no desempenho que acompanha a descompressão foi aceitável.

O que eu mais gosto nessa abordagem é que o suporte ao GeoTIFF é quase universal, enquanto o suporte a formatos baseados em wavelet nem sempre é garantido e às vezes está sujeito a problemas de licenciamento espinhosos.


3

Minha experiência comparando a compactação ECW ( Enhanced Compressed Wavelet ) do GeoTIFF vs. Earth Resource Mapping é que o ECW tem ordens de magnitude melhores ao compactar fotos aéreas de alta resolução. Outra vantagem importante da compactação baseada em wavelet é que, diferentemente dos formatos mais antigos como GeoTIFF, JPEG - não JPEG 2000 -, apenas uma parte da imagem pode ser descompactada [ref. 1] A importância dessa vantagem não deve ser subestimada, especialmente quando se trabalha com "maior que cerca da metade do tamanho da memória do computador".

Parece - nunca tive a chance de testá-lo - que o MrSID , outro formato de arquivo proprietário, baseado em wavelet, também exibe taxas de compactação mais altas do que os formatos "mais antigos" e descompactação seletiva.

ref. 1: http://www.ifp.uni-stuttgart.de/publications/phowo01/Ueffing.pdf


11
Por outro lado, lembre-se de que o GeoTIFF-Packbits ou o GeoTIFF-LZW são compressões sem perdas, enquanto ECW e JPEG são com perdas. A compactação sem perdas ou com perdas deve ser escolhida cuidadosamente, dependendo do uso futuro dos dados.
markusN

11
Não estou afirmando que um formato de compactação flexível é sempre um formato de armazenamento válido. O que eu queria dizer é que o uso de um formato como ECW é adequado em alguns ambientes de produção. Por exemplo, o ECW é um formato mais adequado que o GeoTIFF se tivermos uma instância do MapServer servindo camadas de ortophoto via WMS. Nada proíbe que você também armazene a ortophoto usando a compactação sem perdas.
dariapra

3

As respostas de @dodobas e @ matt-wilkie cobrem quase tudo relacionado aos atos de compactação e desfoque com o GDAL para reduzir o tamanho da imagem.

Eu gostaria de adicionar duas coisas:

  • a documentação em formato de arquivo da GDAL: http://www.gdal.org/frmt_gtiff.html ;
    • Veja as opções de criação ( -co), especificamente:
      • COMPRESS
      • NUM_THREADS
      • PREDICTOR
      • ZLEVEL
  • e que é essencial verificar se o software que consumirá os GeoTIFFs:
    • suporta o método de compactação desejado;
    • recomenda o uso de compactação.

Por exemplo, o GeoServer não recomenda a compactação de GeoTIFFs :

Como nota final, o Geotiff suporta vários tipos de compactação, mas sugerimos não usá-lo. Embora ele permita arquivos muito menores, o processo de descompactação é caro e será executado em cada acesso a dados, diminuindo significativamente a renderização. Em nossa experiência, o tempo de descompressão é superior à leitura pura de dados do disco.

Isso é especialmente verdadeiro se você já estiver usando visões gerais, lado a lado e mídia de armazenamento de alto desempenho (disco de nível corporativo ou SSD).


Também preciso copiar minha imagem jpeg porque não consigo converter meu raster em array com o gdalin Python. Está mostrando um erro de memória e, às vezes, falta de memória. Alguém poderia ter alguma idéia de como implementar esta linha (gdal_translate -co "COMPRESS = método" src_dataset dst_dataset) em python. Eu sou novo no uso de gdal. Então, às vezes é difícil para mim entender a estrutura.
Shiuli Pervin 22/09/16

11
@ ShiuliPervin, primeiro, o JPEG já é um formato compactado (com perdas). Segundo, parece que você tem um problema de pedaço, não de compactação. Leia o arquivo em blocos, tiras ou bloco, em vez de todos de uma vez. Mesmo que o arquivo seja compactado, ele terá que ser descompactado quando você o usar (exemplo: se um arquivo de 4 GB usar 2 GB no disco quando compactado, ele ainda precisará de 4 GB de RAM quando estiver todo carregado para processamento. economia de espaço alternativa, você pode querer olhar para a formatação escassos para GeoTIFFs .
Kevin

11
@ShiuliPervin, No entanto, posso estar entendendo mal sua pergunta. A compactação em si costuma usar muita memória, mas não deve sobrecarregar o sistema, a menos que haja um erro na biblioteca ou se você receber um argumento inválido. Se você estiver tendo problemas com o JPEG como o tipo de compactação para um GeoTIFF, talvez tente LZMA ou DEFLATE.
Kevin

0

Para aqueles que usam versões mais recentes do GDAL, há também as opções de compactação sem perdas do ZStandard ( ZSTD ) (GDAL> = 2.3) e com compactação com perdas limitadas por compressão de varredura de erros ( LERC ) (GDAL> = 2.4).

De um modo geral, porém, ZSTDoferece velocidades de leitura de dados mais rápidas que ambas LZWe DEFLATEcom taxas de compactação semelhantes, embora possa ser um pouco mais lento ao gravar o arquivo (dependendo das configurações usadas).

Se você não se preocupa tanto com a precisão dos dados (por exemplo, apenas visualizando e não analisando), LERCpode ser uma boa opção. Há uma MAX_Z_ERRORconfiguração que permite ajustar a precisão que você está disposto a sacrificar. Por exemplo, a MAX_Z_ERROR=0.001ou 1 mm proporcionou uma economia de espaço de 50% em uma referência (consulte ref ).

A melhor parte é que você também pode combinar LERCcom o ZSTDuso COMPRESS=LERC_ZSTD! Ou se você preferir usar DEFLATE, pode fazer COMPRESS=LERC_DEFLATE. Veja também a lista completa de combinações / configurações nos documentos oficiais do GDAL GeoTIFF https://gdal.org/drivers/raster/gtiff.html#creation-options

Mais detalhes e comparações completas de benchmarks podem ser encontrados nesta referência valiosa:

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.