¿Hay algún medio para verificar si 2 capas ráster dadas tienen contenido idéntico ?
Tenemos un problema con nuestro volumen de almacenamiento compartido corporativo: ahora es tan grande que lleva más de 3 días realizar una copia de seguridad completa. La investigación preliminar revela que uno de los principales culpables que consumen espacio son los rásteres de encendido / apagado que realmente deberían almacenarse como capas de 1 bit con compresión CCITT.
Esta imagen de muestra es actualmente de 2 bits (por lo tanto, 3 valores posibles) y se guarda como tiff comprimido LZW, 11 MB en el sistema de archivos. Después de convertir a 1 bit (es decir, 2 valores posibles) y aplicar la compresión CCITT Group 4, lo reducimos a 1.3 MB, casi un orden completo de magnitud de ahorro.
(Este es en realidad un ciudadano muy bien educado, ¡hay otros almacenados como flotantes de 32 bits!)
¡Estas son noticias fantásticas! Sin embargo, hay casi 7,000 imágenes para aplicar esto también. Sería sencillo escribir un script para comprimirlos:
for old_img in [list of images]:
convert_to_1bit_and_compress(old_img)
remove(old_img)
replace_with_new(old_img, new_img)
... pero le falta una prueba vital: ¿la versión recién comprimida es idéntica al contenido?
if raster_diff(old_img, new_img) == "Identical":
remove(old_img)
rename(new_img, old_img)
¿Existe alguna herramienta o método que pueda (des) probar automáticamente que el contenido de la Imagen-A es de valor idéntico al contenido de la Imagen-B?
Tengo acceso a ArcGIS 10.2 y QGIS, pero también estoy abierto a casi cualquier otra cosa que pueda evitar la necesidad de inspeccionar todas estas imágenes manualmente para garantizar la corrección antes de sobrescribir. Sería horrible para convertir por error y sobrescribir una imagen que realmente hizo tiene más de encendido / apagado valores en ella. La mayoría cuesta miles de dólares para reunir y generar.
Actualización: los mayores infractores son flotadores de 32 bits que varían hasta 100,000 px por lado, por lo que ~ 30 GB sin comprimir.
fuente
raster_diff(old_img, new_img) == "Identical"
sería verificar que el máximo zonal del valor absoluto de la diferencia sea igual a 0, donde la zona se toma en toda la extensión de la cuadrícula. ¿Es este el tipo de solución que estás buscando? (Si es así, tendría que ser refinado para comprobar que todos los valores NoData son consistentes, también.)NoData
manejo adecuado se mantenga en la conversación.len(numpy.unique(yourraster)) == 2
, entonces sabe que tiene 2 valores únicos y puede hacerlo de manera segura.numpy.unique
será más costoso desde el punto de vista computacional (tanto en términos de tiempo como de espacio) que la mayoría de las otras formas de verificar que la diferencia es una constante. Cuando se enfrenta a una diferencia entre dos rásteres de punto flotante muy grandes que exhiben muchas diferencias (como comparar un original con una versión comprimida con pérdida), es probable que se empantane para siempre o falle por completo.gdalcompare.py
mostró una gran promesa ( ver respuesta )Respuestas:
Intente convertir sus rásteres en matrices numpy y luego verifique si tienen la misma forma y elementos con array_equal . Si son iguales, el resultado debería ser
True
:ArcGIS:
GDAL:
fuente
NoData
manejo,RasterToNumPyArray
asigna por defecto el valor NoData del ráster de entrada a la matriz. El usuario puede especificar un valor diferente, aunque eso no se aplicaría en el caso de Matt. En cuanto a la velocidad, el script tardó 4,5 segundos en comparar 2 rásteres de 4 bits con 6210 columnas y 7650 filas (extensión DOQQ). No he comparado el método con ningún resumen zonal.Puede probar con el script gdalcompare.py http://www.gdal.org/gdalcompare.html . El código fuente del script está en http://trac.osgeo.org/gdal/browser/trunk/gdal/swig/python/scripts/gdalcompare.py y, dado que es un script de Python, debería ser fácil eliminar lo innecesario pruebas y agregue nuevas para satisfacer sus necesidades actuales. El guión parece hacer una comparación píxel por píxel al leer los datos de imagen de las dos imágenes banda por banda y ese es probablemente un método bastante rápido y reutilizable.
fuente
Sugeriría que construya su tabla de atributos ráster para cada imagen, luego puede comparar las tablas. Esta no es una verificación completa (como calcular la diferencia entre los dos), pero la probabilidad de que sus imágenes sean diferentes con los mismos valores de histograma es muy muy pequeña. También le da el número de valores únicos sin NoData (del número de filas en la tabla). Si su recuento total es menor que el tamaño de la imagen, sabe que tiene píxeles NoData.
fuente
La solución más simple que he encontrado es calcular algunas estadísticas de resumen en los rásteres y compararlos. Usualmente uso la desviación estándar y la media, que son robustas para la mayoría de los cambios, aunque es posible engañarlos manipulando intencionalmente los datos.
fuente
La forma más fácil es restar un ráster del otro, si el resultado es 0, ambas imágenes son iguales. También puede ver el histograma o trazar por color el resultado.
fuente