Rendre plusieurs rasters plus uniformes

10

J'ai importé des rasters qui sont censés être connectés en permanence, mais à la place, ils créent une sorte de grille bordée entre eux. Je peux supposer que c'est une question d'étalonnage entre les rasters individuels, mais je ne sais pas comment l'exécuter de manière datawise.

Quelqu'un at-il déjà vécu quelque chose comme ça avant et peut-être connaissez-vous une solution possible pour que l'ensemble de tous les rasters soit plus fluide.

Tous ces éléments sont censés être géographiquement connectés. D'où l'ennui des «frontières» de la place.

J'utilise QGIS sur Windows.

entrez la description de l'image ici

MichaelR
la source

Réponses:

11
  1. Vous pouvez essayer de fusionner les rasters en un seul:

    • Depuis la barre d'outils:

      Raster> Divers> Fusionner

    • Depuis la boîte à outils de traitement:

      GDAL / OGR> Divers> Fusionner

    • Depuis la console GDAL:

      gdal_merge.py -o merged.tif input1.tif input2.tif
      

  1. Ou créez un raster virtuel:

    • Raster> Divers> Créer un raster virtuel
Joseph
la source
1
+1 pour construire un raster virtuel. Cela créera un très petit fichier qui agira comme une seule image fusionnée.
Alexandre Neto
@AlexandreNeto - Merci, j'ai remarqué que la différence de taille de fichier par rapport aux rasters séparés peut être assez stupéfiante =)
Joseph
Lors du choix de la fusion ou de la création d'un raster virtuel, j'obtiens une erreur proclamant que le processus n'a pas pu démarrer. Le porgram n'existe pas ou je n'ai pas les bons droits. Par conséquent, j'ai réussi à faire une fusion ou une génération en chargeant tous les rasters dans le menu Calques et en choisissant à partir de là. La ligne de commande Gdal_merge.bat peut être trop longue, atleast inputx.tif peut suspendre l'opération à 1000 x (rasters différents)
MichaelR
@Michael - Erreur étrange mais content d'avoir trouvé une autre façon d'obtenir vos résultats :)
Joseph
1
@Michael En ligne de commande, vous pouvez alimenter gdalbuildvrtavec le nom de fichier d'un fichier contenant une liste de fichiers, plutôt que de donner de nombreux fichiers image comme arguments: gdalbuildvrt -input_file_list my_liste.txt doq_index.vrt
Detlev
3

La raison de cette apparence mosaïque est que chaque image unique est dessinée avec une échelle de gris étirée de l'image min à l'image max, et NON à travers le min / max global. Lorsque vous fusionnez toutes les images en une seule, eh bien, il n'y a qu'une seule min / max. Il en va de même pour VRT, car VRT traite toutes les images comme une seule (lorsque vous regardez le fichier VRT, vous verrez les statistiques communes).

Lorsque les deux, fusion et VRT, ne sont pas une option, le script suivant peut aider.

Dans la première boucle, j'itère sur toutes les couches, sélectionne les rasters et obtient une estimation de leur intervalle min / max. C'est ainsi que QGIS fonctionne lui-même. À partir de ces valeurs min / max, je calcule le min / max global

Dans la deuxième boucle, les rendus de toutes les couches raster sont configurés de telle sorte que l'échelle de gris est étirée sur l'intervalle global min / max.

gmin = 9999
gmax = -9999
layers = []
# loop over all layers, take rasters and estimate min, max values
for layer in iface.mapCanvas().layers():
    if isinstance(layer, QgsRasterLayer):
        # change percentages and sample size to increase or decrease accuracy
        min_max = layer.dataProvider().cumulativeCut(1, 0.02, 0.98, theSampleSize=250000)
        gmin = min(gmin, min_max[0])
        gmax = max(gmax, min_max[1])
        layers.append(layer)

# for all rasters create a single band gray scale renderer with 
# gray scale stretched across the interval [gmin..gmax]
for rasterlayer in layers:
    renderer = QgsSingleBandGrayRenderer(rasterlayer.dataProvider(), 1)
    # take the first band (0)
    ce = QgsContrastEnhancement(rasterlayer.dataProvider().dataType(0))
    ce.setContrastEnhancementAlgorithm(QgsContrastEnhancement.StretchToMinimumMaximum)
    ce.setMinimumValue(gmin)
    ce.setMaximumValue(gmax)
    renderer.setContrastEnhancement(ce)

    rasterlayer.setRenderer(renderer)

# refresh canvas to show changes
iface.mapCanvas().refresh()
Detlev
la source