La ragione di questo aspetto a mosaico è che ogni singola immagine è disegnata con una scala di grigi allungata dall'immagine min a immagine max, e NON attraverso il min / max globale. Quando unisci tutte le immagini in una, beh, c'è solo un min / max. Lo stesso vale per VRT, poiché VRT tratta tutte le immagini come una (quando dai un'occhiata al file VRT vedrai le statistiche comuni).
Quando entrambi, unisci e VRT, non sono un'opzione, il seguente script potrebbe essere d'aiuto.
Nel primo ciclo eseguo l'iterazione su tutti i livelli, selezionando i raster e ottenendo una stima del loro intervallo min / max. Questo è il modo in cui funziona QGIS stesso. Da questi valori min / max ho calcolato il min / max globale
Nel secondo ciclo i renderer per tutti i livelli raster sono configurati in modo tale che la scala dei grigi sia estesa nell'intervallo min / max globale.
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()