10 votos

¿Diff de la trama: Cómo comprobar si las imágenes tienen valores idénticos?

Hay un medio para comprobar si alguna de las 2 dadas las capas ráster tienen idéntico contenido?

Tenemos un problema en nuestra empresa, volumen de almacenamiento compartido: es ahora tan grande que tarda más de 3 días para realizar una copia de seguridad completa. Investigación preliminar revela uno de los más grandes que ocupan mucho espacio culpables son los rásteres que realmente debe ser almacenado como de 1 bit capas con la compresión CCITT.

a typical present/not-present raster

Esta imagen de muestra es actualmente 2bit (para 3 valores posibles) y se guardan como LZW tiff comprimido, de 11 MB en el sistema de archivos. Después de la conversión a 1bit (para 2 valores posibles) y la aplicación de compresión CCITT Grupo 4 podemos llegar a 1.3 MB, casi un orden de magnitud de los ahorros.

(Esto es realmente un muy bien portado ciudadano, hay otras que se almacenan como de 32 bits flotante!)

Esta es una noticia fantástica! Sin embargo, hay casi 7.000 imágenes para aplicar este también. Sería sencillo para escribir una secuencia de comandos para comprimir:

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: es la nueva versión comprimida de contenido idéntico?

  if raster_diff(old_img, new_img) == "Identical":
      remove(old_img)
      rename(new_img, old_img)

Hay una herramienta o método que puede automáticamente (dis)demostrar el contenido de la Imagen es Un valor idéntico al contenido de la Imagen-B?

Tengo acceso a ArcGIS 10.2 y QGIS, pero también estoy abierto a la mayoría de cualquier otra cosa que se puede obviar la necesidad de inspeccionar todas estas imágenes manualmente para garantizar la corrección antes de que se sobrescriban. Sería horrible, erróneamente, convertir y sobrescribir una imagen que realmente hizo tener más de encendido/apagado de los valores en él. La mayoría de costar miles de dólares para recopilar y generar.

a very bad result

actualización: El más grande de los delincuentes son de 32 bits carrozas que van hasta 100.000 px a un lado, de modo que ~30 GB sin comprimir.

8voto

Aaron Puntos 25882

Intente convertir sus tramas a arreglos numpy y entonces comprobar para ver si tienen la misma forma y los elementos con array_equal. Si son iguales, el resultado debe ser True :

ArcGIS:

import arcpy, numpy

raster1 = r'C:\path\to\raster.tif'
raster2 = r'C:\path\to\raster.tif'

r1 = arcpy.RasterToNumPyArray(raster1)
r2 = arcpy.RasterToNumPyArray(raster2)

d = numpy.array_equal(r1,r2)

if d == False:
    print "They differ"

else:
    print "They are the same"

GDAL:

import numpy
from osgeo import gdal        

raster1 = r'C:\path\to\raster.tif'
raster2 = r'C:\path\to\raster.tif'

ds1 = gdal.Open(raster1)
ds2 = gdal.Open(raster2)

r1 = numpy.array(ds1.ReadAsArray())
r2 = numpy.array(ds2.ReadAsArray())

d = numpy.array_equal(r1,r2)

if d == False:
    print "They differ"

else:
    print "They are the same"

4voto

Joe Puntos 16

Usted podría tener una oportunidad con gdalcompare.py secuencia de comandos http://www.gdal.org/gdalcompare.html. El código fuente del script es en http://trac.osgeo.org/gdal/browser/trunk/gdal/swig/python/scripts/gdalcompare.py y porque es una secuencia de comandos de python que debe ser fácil de quitar los exámenes innecesarios y añadir otros nuevos para satisfacer sus necesidades actuales. El guión parece hacer un pixel por un pixel de comparación mediante la lectura de los datos de la imagen de las dos imágenes de la banda por banda y que es probablemente muy rápido y reutilizables método.

1voto

xenny Puntos 670

Yo sugeriría que usted construye su tabla de atributos de ráster para cada imagen, a continuación, puede comparar las tablas. Esto no es una revisión completa (como calculando la diferencia entre los dos), pero la probabilidad de que sus imágenes son diferentes con el mismo histograma de los valores es muy, muy pequeño. También se le da el número de valores únicos sin NoData (desde el número de filas de la tabla). Si el recuento total es menor que el tamaño de la imagen, usted sabe que usted tiene NoData píxeles.

0voto

Robert Höglund Puntos 5572

La solución más sencilla que he encontrado es calcular algunas estadísticas de las tramas y compararlos. Yo suelo utilizar la desviación estándar y la media, que son robustos a la mayoría de los cambios, aunque es posible engañar manipulando intencionalmente los datos.

mean_obj = arcpy.GetRasterProperties(input_raster, 'MEAN')
mean = float(mean_obj.getOutput(0))
if round(mean, 4) != 0.2010:
    print("raster differs from expected mean.")

std_obj = arcpy.GetRasterProperties(input_raster, 'STD')
std = float(std_obj.getOutput(0))
if round(std, 4) != 0.0161:
    print("raster differs from expected standard deviation.")

0voto

radoulov Puntos 1551

La forma más fácil es restar un raster de la otra, si el resultado es 0, entonces ambas imágenes son las mismas. También puede ver el histograma o diagrama de color el resultado.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X