Сделайте несколько растров более однородными

10

Я импортировал несколько растров, которые должны быть непрерывно связаны, но вместо этого они создают какую-то границу между ними. Я могу предположить, что это вопрос калибровки между отдельными растрами, но я не уверен, как выполнить это с использованием данных.

Кто-нибудь испытывал нечто подобное раньше и, возможно, знал о возможном решении, чтобы в целом все растры были более гладкими.

Все они должны быть географически связаны. Отсюда проблема «границ» площади.

Я использую QGIS на Windows.

введите описание изображения здесь

MichaelR
источник

Ответы:

11
  1. Вы можете попробовать объединить растры в один:

    • С панели инструментов:

      Растр> Разное> Слияние

    • Из панели инструментов обработки:

      GDAL / OGR> Разное> Слияние

    • Из консоли GDAL:

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

  1. Или создайте виртуальный растр:

    • Растр> Разное> Построить виртуальный растр
Джозеф
источник
1
+1 за сборку Virtual Raster. Это создаст очень маленький файл, который будет действовать как одно объединенное изображение.
Александр Нето
@AlexandreNeto - Спасибо, я заметил, что разница в размере файла по сравнению с отдельными растрами может быть весьма ошеломляющей =)
Джозеф
При выборе слияния или построения виртуального растра я получаю сообщение о том, что процесс не может быть запущен. Программа не существует или у меня нет прав. Поэтому мне удалось выполнить слияние или сборку, загрузив все растры в меню Layers и выбрав их там. Командная строка Gdal_merge.bat может быть слишком длинной, по крайней мере inputx.tif может приостановить операцию на 1000 x (разные растры)
MichaelR
@Michael - Странная ошибка, но рад, что вы нашли другой способ получить свои результаты :)
Джозеф
1
@Michael В командной строке вы можете указать gdalbuildvrtимя файла, содержащего список файлов, а не указывать множество файлов изображений в качестве аргументов: gdalbuildvrt -input_file_list my_liste.txt doq_index.vrt
Детлев
3

Причина такого мозаичного вида заключается в том, что каждое отдельное изображение рисуется с серой шкалой, растянутой от минимального к максимальному изображению, а НЕ по всему минимальному / максимальному. Когда вы объединяете все изображения в одно, ну, есть только один мин / макс. То же самое верно и для VRT, поскольку VRT рассматривает все изображения как одно (когда вы посмотрите в файл VRT, вы увидите общую статистику).

Когда оба, слияние и VRT, не являются опцией, следующий скрипт может помочь.

В первом цикле я перебираю все слои, выбирая растры и получаю оценку их минимального / максимального интервала. Так работает сама QGIS. Из этих значений min / max я вычисляю глобальные 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()
Детлеф
источник