Effectuer la réduction du bruit raster et le lissage des bords?

22

J'ai une image raster comme celle-ciImage raster

Je veux supprimer le point de bruit isolé et lisser le bord (par exemple, les points simples blancs et je veux que les bords de l'entité soient lisses). Comment puis-je faire cela dans ArcGIS ou dans R?

La taille des cellules est de 30 * 30.

Vu
la source

Réponses:

15

Les opérations morphologiques Expand et Shrink ont été créées pour ce type de traitement. Utilisez ArcGIS (ou GRASS ou Mathematica ) car Rla bibliothèque "raster" de est trop lente.


Souvent, cela aide à expérimenter un peu avec les paramètres: vous devez décider de la quantité d'agrandissement et de rétrécissement nécessaire pour nettoyer une image; et généralement, vous voulez en faire le moins possible, car chaque opération a tendance à lisser certains des détails nets. Voici une séquence qui fonctionne bien pour éliminer une grande partie du "bruit" apparent tout en conservant la plupart des détails dans les "entités". "Expansion" et "rétrécissement" sont tous deux en référence aux globules blancs, de sorte que l'expansion les fait croître vers l'extérieur et le rétrécissement fait que les globules noirs empiètent sur les régions blanches.

Tableau d'images

La colonne "différence" utilise la couleur pour mettre en évidence les différences entre l'image de début et de fin à chaque étape: bleu pour le noir qui est devenu blanc et orange pour le blanc qui est devenu noir.

Si les plus gros morceaux restants doivent être supprimés, il est préférable de le faire avec RegionGroup pour les identifier, après quoi ils peuvent être effacés par reclassification. C'était une option au départ, mais un petit nettoyage initial avec Expandet Shrinkréduit le travail et fournit le lissage souhaité.


Soit dit en passant, j'ai choisi de créer les huit images de cette illustration avec les commandes Mathematica car elles sont si simples, faciles et rapides à exécuter:

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 *)

Le flux de travail dans ArcGIS est le même, mais la syntaxe sera plus longue. Si vous voulez vraiment l'utiliser R, chargez la bibliothèque "raster" et exploitez focalFilterpour créer des fonctions pour faire l'expansion et la réduction. Attendez ensuite environ une minute chacun pour exécuter les opérations ....

whuber
la source
Bonjour! Si cela ne vous dérange pas, pourriez-vous m'envoyer vos coordonnées? Je voudrais vous remercier dans mes recherches. Remercier! @whuber
Vu
Connaissez-vous les commandes équivalentes dans GRASS?
Richard
1
@ Richard Je suis sûr qu'il existe de nombreuses façons créatives d'effectuer ces opérations dans GRASS, mais r.neighbors semble bien adapté à la tâche.
whuber
12

À l'aide de l'extension Spatial Analyst, vous pouvez utiliser certains des outils de généralisation . Certains d'entre eux effectuent des tâches similaires, vous devrez donc peut-être jouer avec quelques-uns pour obtenir les résultats souhaités. Mais, j'aimerais jeter un œil à l' outil Filtre majoritaire et à l' outil Nettoyage des limites .

Voici une page sur les concepts de ces deux outils.

Je ne sais pas comment effectuer ces tâches dans R, mais voici un article sur la façon d'effectuer un filtre majoritaire à l'aide de GRASS GIS.

Fezter
la source
2

Il s'agit essentiellement d'une variante de la réponse de @ whuber et utilise la distance euclidienne pour étendre et rétrécir les limites du raster pour lisser les coins nets du raster, ce qui est exagéré par le processus d'expansion-rétrécissement qui utilise le nombre de cellules pour croître / empiéter. Bien que la distance euclidienne imite l'expansion, il n'est pas possible d'introduire une valeur négative pour empiéter / rétrécir. L'astuce consiste à développer un processus itératif pour prendre le négatif de la distance euclidienne raster et le développer. Vous trouverez ci-dessous les étapes de l'exemple d'imagerie donné et les instantanés de clarification.

  1. Reclassifier le raster pour ne conserver que 1 s (globules blancs)

  2. Appliquer la distance euclidienne pour la distance à deux cellules (60 mètres dans ce cas) au raster reclassifié

  3. Prenez le négatif du raster développé en utilisant Reclassifier (les cellules avec la valeur obtiendront NODATA et NODATA deviendront 1) ou les opérateurs Con et IsNull de la calculatrice raster

  4. Appliquez à nouveau la distance euclidienne à ce raster négatif avec la même distance (60 m)

  5. Prenez le négatif de ceci en suivant le même processus donné ci-dessus

  6. Utilisez Raster Calculator ou Reclassify pour affecter des cellules NODATA à 0 dans ce raster pour revenir aux valeurs d'origine de l'exemple de raster

Développer Rétrécissement vs distance euclidienne

Agrandir et réduireDistance euclidienne

Remarque: le vert montre les cellules traitées (globules blancs dans les questions)

L'avantage de la distance euclidienne est qu'il prend la bonne distance de chaque cellule à travers l'étendue de l'hypoténuse qui lisse les bords autrement coupants. Le nombre de paramètres de cellule des outils d'agrandissement et de rétrécissement, d'autre part, traite le même nombre de cellules pour toutes les directions, ce qui donne des bords de type boîte englobante, généralisant donc trop les bords / coins.

Le problème principal, cependant, ne supprime pas le bruit avec autant de succès que l'expansion / la réduction et il est un peu plus long que la réponse.

fatih_dur
la source
Pour quiconque fait cela et utilise GRASS / QGIS - vous pouvez utiliser r.grow et croître par une distance euclidienne positive, suivie d'une distance euclidienne négative
srha