Existe-t-il un moyen de vérifier si 2 couches raster données ont un contenu identique ?
Nous avons un problème sur le volume de stockage partagé de notre entreprise: il est maintenant si important qu'il faut plus de 3 jours pour effectuer une sauvegarde complète. Une enquête préliminaire révèle que l'un des plus grands coupables consommant de l'espace sont les rasters on / off qui devraient vraiment être stockés sous forme de couches 1 bit avec la compression CCITT.
Cet exemple d'image est actuellement de 2 bits (donc 3 valeurs possibles) et enregistré en tant que tiff compressé LZW, 11 Mo dans le système de fichiers. Après avoir converti en 1 bit (donc 2 valeurs possibles) et appliqué la compression CCITT Group 4, nous le réduisons à 1,3 Mo, soit presque un ordre de grandeur d'économies.
(Il s'agit en fait d'un citoyen très bien élevé, il y en a d'autres stockés sous forme de flotteur 32 bits!)
Ce sont des nouvelles fantastiques! Cependant, il y a près de 7 000 images à appliquer également. Il serait simple d'écrire un script pour les compresser:
for old_img in [list of images]:
convert_to_1bit_and_compress(old_img)
remove(old_img)
replace_with_new(old_img, new_img)
... mais il manque un test essentiel: la nouvelle version compressée est-elle identique au contenu?
if raster_diff(old_img, new_img) == "Identical":
remove(old_img)
rename(new_img, old_img)
Existe-t-il un outil ou une méthode qui peut (dé) prouver automatiquement que le contenu de l'Image-A est identique en valeur au contenu de l'Image-B?
J'ai accès à ArcGIS 10.2 et QGIS, mais je suis également ouvert à presque tout ce qui ne peut pas nécessiter l'inspection manuelle de toutes ces images pour garantir leur exactitude avant de les écraser. Il serait horrible de convertir à tort et écraser une image qui vraiment n'avoir plus on / off valeurs en elle. La plupart coûtent des milliers de dollars à rassembler et à générer.
mise à jour: Les plus grands contrevenants sont les flotteurs 32 bits qui vont jusqu'à 100 000 pixels sur un côté, donc ~ 30 Go non compressés.
la source
raster_diff(old_img, new_img) == "Identical"
serait de vérifier que le zonal max de la valeur absolue de la différence est égal à 0, où la zone est prise sur toute l'étendue de la grille. Est-ce le type de solution que vous recherchez? (Si tel est le cas, il devrait être affiné pour vérifier que toutes les valeurs NoData sont également cohérentes.)NoData
gestion reste dans la conversation.len(numpy.unique(yourraster)) == 2
, vous savez qu'il a 2 valeurs uniques et vous pouvez le faire en toute sécurité.numpy.unique
- jacent va être plus coûteux en termes de calcul (en termes de temps et d'espace) que la plupart des autres moyens de vérifier que la différence est une constante. Lorsqu'il est confronté à une différence entre deux très grands rasters à virgule flottante qui présentent de nombreuses différences (comme la comparaison d'un original à une version compressée avec perte), il risque de s'enliser pour toujours ou d'échouer complètement.gdalcompare.py
montré une grande promesse ( voir la réponse )Réponses:
Essayez de convertir vos rasters en tableaux numpy, puis vérifiez s'ils ont la même forme et les mêmes éléments avec array_equal . S'ils sont identiques, le résultat devrait être
True
:ArcGIS:
GDAL:
la source
NoData
gestion,RasterToNumPyArray
affecte par défaut la valeur NoData du raster en entrée au tableau. L'utilisateur peut spécifier une valeur différente, bien que cela ne s'applique pas dans le cas de Matt. En ce qui concerne la vitesse, il a fallu 4,5 secondes au script pour comparer 2 rasters 4 bits avec 6210 colonnes et 7650 lignes (étendue DOQQ). Je n'ai comparé la méthode à aucun résumé de zone.Vous pouvez essayer avec le script gdalcompare.py http://www.gdal.org/gdalcompare.html . Le code source du script se trouve à http://trac.osgeo.org/gdal/browser/trunk/gdal/swig/python/scripts/gdalcompare.py et parce qu'il s'agit d'un script python, il devrait être facile de supprimer l'inutile tests et en ajouter de nouveaux pour répondre à vos besoins actuels. Le script semble faire une comparaison pixel par pixel en lisant les données d'image des deux images bande par bande et c'est probablement une méthode assez rapide et réutilisable.
la source
Je vous suggère de créer votre table d'attributs raster pour chaque image, puis vous pouvez comparer les tables. Ce n'est pas une vérification complète (comme calculer la différence entre les deux), mais la probabilité que vos images soient différentes avec les mêmes valeurs d'histogramme est très très faible. Il vous donne également le nombre de valeurs uniques sans NoData (à partir du nombre de lignes dans le tableau). Si votre nombre total est inférieur à la taille de l'image, vous savez que vous disposez de pixels NoData.
la source
La solution la plus simple que j'ai trouvée consiste à calculer des statistiques récapitulatives sur les rasters et à les comparer. J'utilise généralement l'écart-type et la moyenne, qui sont robustes à la plupart des changements, bien qu'il soit possible de les tromper en manipulant intentionnellement les données.
la source
Le moyen le plus simple consiste à soustraire un raster de l'autre, si le résultat est 0, les deux images sont identiques. Vous pouvez également voir l'histogramme ou tracer par couleur le résultat.
la source