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.
fonte
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.)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 )Respostas:
Tente converter suas rasters em matrizes numpy e verifique se elas têm a mesma forma e elementos com array_equal . Se forem iguais, o resultado deve ser
True
:ArcGIS:
GDAL:
fonte
NoData
manipulação,RasterToNumPyArray
atribui por padrão o valor NoData da varredura de entrada à matriz. O usuário pode especificar um valor diferente, embora isso não se aplique no caso de Matt. Em relação à velocidade, o script levou 4,5 segundos para comparar 2 rasters de 4 bits com 6210 colunas e 7650 linhas (extensão DOQQ). Não comparei o método a nenhum resumo de zonas.Você pode tentar o script gdalcompare.py http://www.gdal.org/gdalcompare.html . O código fonte do script está em http://trac.osgeo.org/gdal/browser/trunk/gdal/swig/python/scripts/gdalcompare.py e, por ser um script python, deve ser fácil remover os itens desnecessários. testes e adicione novos para atender às suas necessidades atuais. O script parece fazer comparação pixel por pixel lendo dados de imagem das duas imagens, banda por banda, e esse é provavelmente um método rápido e reutilizável.
fonte
Sugiro que você construa sua tabela de atributos raster para cada imagem e compare as tabelas. Essa não é uma verificação completa (como calcular a diferença entre as duas), mas a probabilidade de suas imagens serem diferentes com os mesmos valores de histograma é muito pequena. Além disso, fornece o número de valores exclusivos sem NoData (do número de linhas na tabela). Se sua contagem total for menor que o tamanho da imagem, você saberá que possui pixels NoData.
fonte
A solução mais simples que encontrei é calcular algumas estatísticas resumidas sobre os rasters e compará-las. Eu geralmente uso desvio e média padrão, que são robustos para a maioria das alterações, embora seja possível enganá-las manipulando intencionalmente os dados.
fonte
A maneira mais fácil é subtrair uma varredura da outra, se o resultado for 0, as duas imagens serão iguais. Além disso, você pode ver o histograma ou plotar pela cor do resultado.
fonte