Existe um meio de verificar se duas camadas de varredura fornecidas têm conteúdo idêntico ?
Temos um problema no nosso volume de armazenamento compartilhado corporativo: agora é tão grande que leva mais de três dias para realizar um backup completo. A investigação preliminar revela que um dos maiores culpados por consumir espaço são os controladores on / off que realmente devem ser armazenados como camadas de 1 bit com compressão CCITT.
Atualmente, esta imagem de amostra é de 2 bits (portanto, 3 valores possíveis) e salva como tiff compactado LZW, 11 MB no sistema de arquivos. Depois de converter para 1bit (portanto, 2 valores possíveis) e aplicar a compactação do CCITT Group 4, reduzimos para 1,3 MB, quase uma ordem completa de magnitude de economia.
(Na verdade, este é um cidadão muito bem-comportado, existem outros armazenados como bóia de 32 bits!)
Esta é uma notícia fantástica! No entanto, existem quase 7.000 imagens para aplicar isso também. Seria simples escrever um script para compactá-los:
for old_img in [list of images]:
convert_to_1bit_and_compress(old_img)
remove(old_img)
replace_with_new(old_img, new_img)
... mas está faltando um teste vital: a versão recém-compactada é idêntica ao conteúdo?
if raster_diff(old_img, new_img) == "Identical":
remove(old_img)
rename(new_img, old_img)
Existe uma ferramenta ou método que pode (des) provar automaticamente que o conteúdo da imagem A é idêntico ao valor da imagem b?
Eu tenho acesso ao ArcGIS 10.2 e QGIS, mas também estou aberto a quase tudo o que pode evitar a necessidade de inspecionar todas essas imagens manualmente para garantir a correção antes da substituição. Seria horrível converter e substituir por engano uma imagem que realmente tinha mais do que valores de ativação / desativação. A maioria custa milhares de dólares para reunir e gerar.
atualização: Os maiores infratores são carros alegóricos de 32 bits que variam de até 100.000px para um lado, portanto, ~ 30 GB não compactados.
NoData
manuseio adequado durante a conversa.
len(numpy.unique(yourraster)) == 2
, sabe que ele possui 2 valores exclusivos e pode fazer isso com segurança.
numpy.unique
será mais caro em termos de computação (tanto em termos de tempo quanto de espaço) do que a maioria das outras maneiras de verificar se a diferença é constante. Quando confrontado com uma diferença entre dois rasters de ponto flutuante muito grandes que exibem muitas diferenças (como comparar um original a uma versão compactada com perda), ele provavelmente fica parado para sempre ou falha completamente.
gdalcompare.py
mostrou uma grande promessa ( ver resposta )
raster_diff(old_img, new_img) == "Identical"
seria verificar se o máximo zonal do valor absoluto da diferença é igual a 0, onde a zona é ocupada em toda a extensão da grade. Esse é o tipo de solução que você está procurando? (Em caso afirmativo, seria necessário refinar para verificar se quaisquer valores de NoData também são consistentes.)