Haz varios rásters más uniformes

10

He importado algunos rásteres que se supone que están conectados continuamente, pero en su lugar crean una especie de cuadrícula con bordes entre ellos. Puedo suponer que se trata de una calibración entre los rásteres individuales, pero no estoy seguro de cómo ejecutarlo de manera data.

¿Alguien ha experimentado algo como esto antes y tal vez conozca una posible solución para que el conjunto de todos los rásteres sea más uniforme?

Se supone que todos estos están conectados geográficamente. De ahí el problema de las 'fronteras' de la plaza.

Estoy usando QGIS en Windows.

ingrese la descripción de la imagen aquí

MichaelR
fuente

Respuestas:

11
  1. Podría intentar fusionar los rásteres en uno:

    • Desde la barra de herramientas:

      Ráster> Varios> Fusionar

    • Desde la caja de herramientas de procesamiento:

      GDAL / OGR> Varios> Fusionar

    • Desde la consola GDAL:

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

  1. O cree un ráster virtual:

    • Ráster> Varios> Crear ráster virtual
Joseph
fuente
1
+1 para compilar Ráster virtual. Esto creará un archivo muy pequeño que actuará como una sola imagen fusionada.
Alexandre Neto
@AlexandreNeto - Gracias, me he dado cuenta de que la diferencia en el tamaño del archivo en comparación con los rásteres separados puede ser bastante asombrosa =)
Joseph
Al elegir la fusión o compilación de ráster virtual, aparece un error que proclama que el proceso no pudo comenzar. El porgrama no existe o no tengo los derechos correctos. Por lo tanto, logré fusionar o compilar cargando todos los rásteres en el menú Capas y eligiendo desde allí. La línea de comando Gdal_merge.bat puede ser demasiado larga, al menos inputx.tif puede suspender la operación a 1000 x (diferentes rásteres)
MichaelR
@Michael: extraño error, pero me alegro de que hayas encontrado otra forma de obtener tus resultados :)
Joseph
1
@Michael En la línea de comando puede alimentar gdalbuildvrtcon el nombre de archivo de un archivo que contiene una lista de archivos, en lugar de dar muchos archivos de imagen como argumentos: gdalbuildvrt -input_file_list my_liste.txt doq_index.vrt
Detlev
3

La razón de esta apariencia en mosaico es que cada imagen individual se dibuja con una escala de grises que se extiende desde la imagen min hasta la imagen max, y NO a través del min / max global. Cuando fusiona todas las imágenes en una, bueno, solo hay un mínimo / máximo. Lo mismo es cierto para VRT, ya que VRT trata todas las imágenes como una sola (cuando eche un vistazo al archivo VRT verá las estadísticas comunes).

Cuando ambos, fusionar y VRT, no son una opción, el siguiente script podría ayudar.

En el primer bucle itero sobre todas las capas, seleccionando los rásteres y obtengo una estimación de su intervalo mínimo / máximo. Así es como funciona QGIS en sí mismo. A partir de estos valores min / max calculo el min / max global

En el segundo bucle, los renderizadores para todas las capas ráster se configuran de modo que la escala de grises se extienda a través del intervalo 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
fuente