Raster-Rauschunterdrückung und Kantenglättung durchführen?

22

Ich habe ein Rasterbild wie diesesRasterbild

Ich möchte den isolierten Rauschpunkt löschen und die Kante glätten (sagen wir die weißen Einzelpunkte, und ich möchte, dass die Kanten des Objekts glatt aussehen). Wie kann ich das in ArcGIS oder in R tun?

Die Zellengröße beträgt 30 * 30.

Gesehen
quelle

Antworten:

15

Für diese Art der Verarbeitung wurden die morphologischen Operationen Expand und Shrink erstellt. Verwenden Sie ArcGIS (oder GRASS oder Mathematica ), weil Rdie "Raster" -Bibliothek zu langsam ist.


Oft ist es hilfreich, ein wenig mit den Parametern zu experimentieren: Sie müssen entscheiden, wie viel Vergrößern und Verkleinern erforderlich ist, um ein Bild zu bereinigen. und normalerweise möchten Sie so wenig wie möglich tun, da bei jeder Operation einige der scharfen Details ausgeglichen werden. Hier ist eine Sequenz, die gut funktioniert, um einen Großteil des scheinbaren "Rauschens" zu beseitigen, während die meisten Details in den "Entitäten" beibehalten werden. "Erweitern" und "Verkleinern" beziehen sich beide auf die weißen Zellen, sodass beim Erweitern diese nach außen wachsen und beim Verkleinern die schwarzen Zellen in weiße Bereiche eindringen.

Bildertabelle

In der Spalte "Unterschied" werden in jedem Schritt Unterschiede zwischen Start- und Endbild farblich hervorgehoben: Blau für Schwarz, das zu Weiß wurde, und Orange für Weiß, das zu Schwarz wurde.

Wenn die größeren verbleibenden Teile entfernt werden müssen, kann dies am besten mit RegionGroup erfolgen , um sie zu identifizieren. Anschließend können sie durch Neuklassifizierung gelöscht werden. Dies war zu Beginn eine Option, jedoch ein wenig Vorreinigung mit Expandund Shrinkreduziert den Arbeitsaufwand und sorgt für die gewünschte Glättung.


Im Übrigen habe ich mich entschieden, die acht Bilder in dieser Abbildung mit Mathematica- Befehlen zu erstellen, da sie so einfach, leicht und schnell auszuführen sind:

i = Import["http://i.stack.imgur.com/umDg7.png"];
l = Dilation[k = Erosion[j = Dilation[i, 2], 3], 1];      (* This does all the work *)
delta = ColorCombine /@ {{i, j}, {j, k}, {k, l}, {i, l}}; (* Compares images *)

Der Workflow in ArcGIS ist identisch, die Syntax ist jedoch länger. Wenn Sie wirklich verwenden möchten R, laden Sie die "Raster" -Bibliothek und focalFiltererstellen Sie Funktionen zum Erweitern und Verkleinern. Warten Sie dann jeweils ungefähr eine Minute, um die Vorgänge auszuführen ....

whuber
quelle
Hallo! Wenn es Ihnen nichts ausmacht, können Sie mir Ihre Kontaktinformationen senden? Ich möchte Sie in meiner Forschung anerkennen. Danken! @whuber
Gesehen am
Kennen Sie die entsprechenden Befehle in GRASS?
Richard
1
@Richard Ich bin mir sicher, dass es in GRASS viele kreative Möglichkeiten gibt, diese Operationen durchzuführen, aber die Nachbarn sehen für die Aufgabe gut geeignet aus.
whuber
12

Mit der Spatial Analyst-Erweiterung können Sie einige der Generalisierungstools verwenden. Einige von ihnen führen ähnliche Aufgaben aus, daher müssen Sie möglicherweise mit einigen herumspielen, um die gewünschten Ergebnisse zu erzielen. Ich würde mir jedoch das Mehrheitsfilter- Tool und das Boundary Clean- Tool ansehen .

Hier finden Sie eine Seite mit den Konzepten dieser beiden Tools.

Ich bin nicht sicher, wie ich diese Aufgaben in R ausführen soll, aber hier ist ein Beitrag zum Ausführen eines Mehrheitsfilters mit GRASS GIS.

Fezter
quelle
2

Dies ist im Grunde eine Variante der Antwort von @ whuber und verwendet den Euklidischen Abstand, um die Rastergrenzen zu erweitern und zu verkleinern, um die scharfen Ecken des Rasters zu glätten, das durch den Erweiterungs- / Verkleinerungsprozess, der die Anzahl der zu vergrößernden / zu übergreifenden Zellen nutzt, übertrieben wird. Obwohl Euklidische Entfernung Expand imitiert, ist es nicht möglich, einen negativen Wert für das Eingreifen / Schrumpfen einzuführen. Der Trick besteht darin, einen iterativen Prozess zu entwickeln, mit dem das Negativ des Rasters "Euklidische Entfernung" aufgenommen und vergrößert wird. Nachfolgend sind die Schritte für die angegebenen Beispielbilder und die Schnappschüsse zur Verdeutlichung aufgeführt.

  1. Raster neu klassifizieren, um nur 1s zu behalten (weiße Zellen)

  2. Wenden Sie den euklidischen Abstand für einen Abstand von zwei Zellen (in diesem Fall 60 Meter) auf das umklassifizierte Raster an

  3. Nehmen Sie das Negativ des erweiterten Rasters mit der Option "Neu klassifizieren" (die Zellen mit dem Wert erhalten NODATA und NODATA werden auf 1 gesetzt) ​​oder den Operatoren "Con" und "IsNull" von Raster Calculator

  4. Wenden Sie Euklidische Entfernung erneut auf dieses negative Raster mit derselben Entfernung (60 m) an.

  5. Machen Sie das Negative daraus, indem Sie den oben beschriebenen Vorgang ausführen

  6. Verwenden Sie Raster Calculator oder Reclassify, um NODATA-Zellen in diesem Raster 0 zuzuweisen und zu den ursprünglichen Werten des Beispielrasters zurückzukehren

Erweitern Sie "Verkleinern vs. Euklidische Entfernung"

Erweitern und verkleinernEuklidische Entfernung

Hinweis: Grün zeigt die verarbeiteten Zellen (weiße Zellen in den Fragen)

Der Vorteil von Euklidianabstand ist, dass er den richtigen Abstand von jeder Zelle durch die Ausdehnung der Hypotenuse nimmt, wodurch ansonsten scharfe Kanten geglättet werden. Die Anzahl der Zellenparameter von Erweiterungs- und Verkleinerungswerkzeugen verarbeitet andererseits die gleiche Anzahl von Zellen für alle Richtungen, was zu kastenähnlichen Kanten führt, wodurch die Kanten / Ecken zu stark verallgemeinert werden.

Das Hauptproblem ist jedoch, dass es das Rauschen nicht so erfolgreich entfernt wie das Erweitern / Verkleinern und etwas länger ist als die Antwort.

fatih_dur
quelle
Für alle, die dies tun und GRASS / QGIS verwenden, können Sie r.grow verwenden und um eine positive euklidische Distanz wachsen, gefolgt von einer negativen euklidischen Distanz
srha