Gibt es eine Möglichkeit zu überprüfen, ob zwei bestimmte Rasterebenen identischen Inhalt haben ?
Wir haben ein Problem mit unserem gemeinsam genutzten Unternehmensspeichervolumen: Es ist jetzt so groß, dass die Durchführung einer vollständigen Sicherung über 3 Tage dauert. Voruntersuchungen haben ergeben, dass On / Off-Raster einer der größten platzraubenden Schuldigen sind, die wirklich als 1-Bit-Layer mit CCITT-Komprimierung gespeichert werden sollten.
Dieses Beispielbild ist derzeit 2 Bit (also 3 mögliche Werte) und wird als LZW-komprimiertes TIFF mit 11 MB im Dateisystem gespeichert. Nach der Konvertierung in 1 Bit (also 2 mögliche Werte) und der Anwendung der CCITT Group 4-Komprimierung wird diese auf 1,3 MB reduziert, was fast einer Größenordnung der Einsparungen entspricht.
(Dies ist eigentlich ein sehr gut erzogener Bürger, es gibt andere, die als 32-Bit-Float gespeichert sind!)
Das sind fantastische Neuigkeiten! Es gibt jedoch fast 7.000 Bilder, um dies auch anzuwenden. Es wäre einfach, ein Skript zu schreiben, um sie zu komprimieren:
for old_img in [list of images]:
convert_to_1bit_and_compress(old_img)
remove(old_img)
replace_with_new(old_img, new_img)
... aber es fehlt ein wichtiger Test: Ist die neu komprimierte Version inhaltsidentisch?
if raster_diff(old_img, new_img) == "Identical":
remove(old_img)
rename(new_img, old_img)
Gibt es ein Werkzeug oder eine Methode, mit der automatisch nachgewiesen werden kann, dass der Inhalt von Bild-A mit dem Inhalt von Bild-B identisch ist?
Ich habe Zugriff auf ArcGIS 10.2 und QGIS, bin aber auch für fast alles andere offen, als die Notwendigkeit zu vermeiden, alle diese Bilder manuell zu überprüfen, um die Richtigkeit vor dem Überschreiben sicherzustellen. Es würde fälschlicherweise convert schrecklich sein und ein Bild überschreiben , dass wirklich haben mehr haben als Ein / Aus - Werte drin. Die meisten kosten Tausende von Dollar, um sie zu sammeln und zu generieren.
Update: Die größten Straftäter sind 32-Bit-Floats, die bis zu 100.000 Pixel pro Seite reichen, also ~ 30 GB unkomprimiert.
quelle
raster_diff(old_img, new_img) == "Identical"
darin, zu überprüfen, ob das zonale Maximum des Absolutwerts der Differenz gleich 0 ist, wobei die Zone über die gesamte Gitterausdehnung genommen wird. Ist dies die Art von Lösung, nach der Sie suchen? (Wenn ja, müsste es verfeinert werden, um zu überprüfen, ob alle NoData-Werte auch konsistent sind.)NoData
Handhabung bleibt im Gespräch.len(numpy.unique(yourraster)) == 2
, wissen Sie, dass es zwei eindeutige Werte hat, und Sie können dies sicher tun.numpy.unique
wird rechenintensiver (sowohl zeitlich als auch räumlich) als die meisten anderen Methoden, um zu überprüfen, ob der Unterschied eine Konstante ist. Bei einem Unterschied zwischen zwei sehr großen Gleitkomma-Rastern, die viele Unterschiede aufweisen (z. B. beim Vergleich eines Originals mit einer verlustbehafteten komprimierten Version), würde es wahrscheinlich für immer festsitzen oder vollständig versagen.gdalcompare.py
zeigte sichAntworten:
Versuchen Sie, Ihre Raster in numpy Arrays zu konvertieren, und überprüfen Sie dann, ob sie dieselbe Form und dieselben Elemente wie array_equal haben . Wenn sie gleich sind, sollte das Ergebnis sein
True
:ArcGIS:
GDAL:
quelle
NoData
Handhabung,RasterToNumPyArray
Abtretungsempfänger der Standardeinstellung Eingabe - Raster des NoData Wert auf dem Array. Der Benutzer kann einen anderen Wert angeben, obwohl dies in Matts Fall nicht zutreffen würde. In Bezug auf die Geschwindigkeit dauerte es 4,5 Sekunden, bis das Skript 2 4-Bit-Raster mit 6210 Spalten und 7650 Zeilen (DOQQ-Umfang) verglichen hatte. Ich habe die Methode nicht mit zonalen Zusammenfassungen verglichen.Sie können es mit dem Skript gdalcompare.py http://www.gdal.org/gdalcompare.html versuchen . Der Quellcode des Skripts befindet sich unter http://trac.osgeo.org/gdal/browser/trunk/gdal/swig/python/scripts/gdalcompare.py. Da es sich um ein Python-Skript handelt, sollte es einfach sein, das Unnötige zu entfernen Tests und fügen Sie neue hinzu, um Ihren aktuellen Anforderungen zu entsprechen. Das Skript scheint einen Pixel-für-Pixel-Vergleich durchzuführen, indem Bilddaten aus den beiden Bildern Band für Band gelesen werden, und das ist wahrscheinlich eine recht schnelle und wiederverwendbare Methode.
quelle
Ich würde vorschlagen, dass Sie Ihre Rasterattributtabelle für jedes Bild erstellen und dann die Tabellen vergleichen. Dies ist keine vollständige Überprüfung (wie die Berechnung der Differenz zwischen den beiden), aber die Wahrscheinlichkeit, dass sich Ihre Bilder bei gleichen Histogrammwerten unterscheiden, ist sehr, sehr gering. Außerdem erhalten Sie die Anzahl der eindeutigen Werte ohne NoData (aus der Anzahl der Zeilen in der Tabelle). Wenn Ihre Gesamtzahl kleiner als die Bildgröße ist, wissen Sie, dass Sie NoData-Pixel haben.
quelle
Die einfachste Lösung, die ich gefunden habe, besteht darin, einige zusammenfassende Statistiken zu den Rastern zu berechnen und diese zu vergleichen. Normalerweise verwende ich Standardabweichung und Mittelwert, die für die meisten Änderungen robust sind, obwohl es möglich ist, sie durch absichtliche Manipulation der Daten zu täuschen.
quelle
Am einfachsten ist es, ein Raster vom anderen zu subtrahieren. Wenn das Ergebnis 0 ist, sind beide Bilder gleich. Sie können auch das Histogramm oder den Plot nach Farbe des Ergebnisses sehen.
quelle