Umfang der Rasterverarbeitung in ArcPy oder ArcGIS Desktop reduzieren?


8

Ich muss den Verarbeitungsumfang meines Rasters durch eine automatische Prozedur in Python reduzieren. Derzeit weisen die Ränder des von mir verwendeten Datensatzes Anomalien auf (aufgrund der Klassifizierung der Landsat-Scanlinien).

ScanLines klassifiziert

Ich möchte den Umfang der Rasterverarbeitung reduzieren, damit beim Abrufen der obigen Informationen durch eine SetNull-Funktion die Rahmen nicht verarbeitet werden. Etwas wie Bereich

Dies kann nun einfach mit einer Funktion zum Extrahieren durch Maske (dh Abbildung 2) durchgeführt werden, obwohl dies eine manuelle Auswahl des Maskierungsbereichs erfordern würde. Gibt es ein Menthod, mit dem ich den Ausdehnungsbereich (ohne Berücksichtigung der Knotenwerte) abzüglich der Randbreite in x- und y-Richtung jeder Zeile / Spalte berechnen und dann das arcpy.env.extentin Python verwenden kann?


Könnten Sie einfach die Ausdehnung des gesamten Rasters ermitteln und dann einen Standardabstand von jeder Seite abziehen? Oder ist das zu simpel?
Radar

Dies würde unter der Annahme funktionieren, dass das Ausmaß von den Bereichen mit Werten und nicht vom gesamten Bereich (dh den Nodata-Werten) abgeleitet wird
BJEBN

1
Ich habe ein bisschen Probleme zu verstehen, was eine "Grenze" ausmacht. Möchten Sie die Scananomalien automatisch erkennen und dann zuschneiden? Wenn ja, suchen Sie nach einer Methode, mit der Sie diese Anomalien erkennen können?
Radar

Der Rand ist der Bereich des Rasters, der Werte enthält - vielleicht ist das zweite Bild oben etwas verwirrend, da ich jetzt sehe, dass es sich um abgelegene Werte handelt (muss eine zusätzliche Ebene aktiviert haben, als ich einen Screenshot gemacht habe). Der durchgezogene Bereich darüber ist der Rasterrand - das rote Quadrat ist die gewünschte Rasterausdehnung, während die aktuelle Rasterausdehnung das gesamte Bild (einschließlich der weißen * nodata-Werte) ist
BJEBN

Antworten:


9

Dieser Workflow behandelt zuerst den Müll, der an den Rändern schwebt, und löst dann das Problem.

  1. Erstellen Sie einen binären Indikator für den "Rand" -Bereich, der alle umgebenden NoData-Zellen enthält. Es ist praktisch, einen beliebigen Wert zu verwenden, um den Rand und NoData für den Rest anzugeben, wie in SetNull(Not(IsNull('X')), 1):

    Rand

  2. Gruppieren Sie das Ergebnis in einer Region und wählen Sie die Rahmenkomponente aus. (Dies kann normalerweise automatisiert werden, indem die Komponente mit dem größten Wert von [Anzahl] ausgewählt wird.) Das Bild sieht fast gleich aus. Hier werden nur einige streunende Pixel in der Mitte ausgeschlossen - sie müssen jedoch ausgeschlossen werden, damit der nächste Schritt funktioniert.

    (Ein alternativer Ansatz besteht darin, morphologische Operationen zuerst zu verwenden, um den Rand zu verkleinern und dann wieder zu erweitern. Dadurch werden die isolierten Bits in der Mitte gelöscht.)

  3. Berechnen Sie das euklidische Abstandsraster zur Randkomponente.

    Entfernungen

  4. Maskieren Sie alle kleinen Abstände im Originalbild wie in SetNull(([Distance to Border component] < 30),X ):

    Ergebnis

(Das endgültige Bild zeigt den ursprünglichen Rand in Grün, der als Referenz auf dem Ergebnis überlagert ist.)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.