Существуют ли различия между форматами .img и .tif, которые влияют на работу GDAL .SetNoDataValue ()? - PullRequest
0 голосов
/ 14 мая 2018

У меня проблема с маскировкой значений Нет данных из статистического анализа растровых изображений.

Входной файл является трехмерным (строки, столбцы и слои) .img-файл. Он открывается с помощьюфункция gdal.Open (), а затем я хочу извлечь статистику по слоям из каждого изображения столбца строки x, которое оно содержит (layer).

Некоторые из этих изображений содержат данные дерьма (или No Data), которые имеютинициаторам набора данных было присвоено значение -0,0.Я не хочу, чтобы эти значения пикселей были включены в статистические вычисления, и мне необходимо их отсеивать.Для этого я использую функцию SetNoDataValue (), которая хорошо работает с изображениями .tif.

К сожалению, с .img, -0.0 продолжает отображаться как минимальное значение каждого слоя (оно должно быть около 270.) в переменной minCubeValues, и, как следствие, средние значения и значения стандартного отклонения являются неверными.

Когда я запускаю эту последовательность для файлов .tif, она работает нормально, но не для файлов .img, и я не могу понять, почему.Мне нужно, чтобы он работал непосредственно с файлами .img, так как большая часть данных моего изображения находится в .img и доступна как таковая.

Я подозреваю, что это сводится к структурным различиям между файлами .img и .tif, но я не могу понять, как это происходит в переменной ds2.

Кто-нибудь сталкивался с этой проблемой раньше и выяснилчто происходило?

Код выглядит следующим образом:

inputFilePathName = str("C:\\ResearchProcess\\2011sst_sstklcube20170628.img")
noDataValue = (-0.0)

ds2 = gdal.Open(inputFilePathName)

layerList = []
minCubeValues = []
maxCubeValues = []
layerMeans = []

for layer in range( ds2.RasterCount ):
    layer += 1
    srcLayer = ds2.GetRasterBand(layer)
    srcLayer.SetNoDataValue(noDataValue) # screens out the No Data value in .tif, for .img, it doesn't :/
    stats = srcLayer.ComputeStatistics( 0 )

    layerList.append(layer)
    minCubeValues.append(stats[0])
    maxCubeValues.append(stats[1])
    layerMeans.append(stats[2])

print minCubeValues

ds2 = None

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Предложение Габриэллы Джордано для адаптации подхода здесь прекрасно работает.Пришлось создать третью переменную ds3Array, так как мне пришлось проходить по слоистым массивам данных слой за слоем в более широком алгоритме.

Приветствия:)

Рабочий код следующим образом.

ds2 = gdal.Open(inputFilePathName)
ds2Array = ds2.ReadAsArray()

layerList = []
minCubeValues = []
maxCubeValues = []
layerMeans = []
layerStdevs = []

for layer in range( ds2.RasterCount ):
    layer += 1
    ds3Array = ds2Array[layer -1]
    ds3Array = np.ma.masked_equal(ds3Array, noDataValue)

    minCubeValues.append(ds3Array.min())
    layerMeans.append(ds3Array.mean())
    layerStdevs.append(ds3Array.std())

Спасибо:)

0 голосов
/ 15 мая 2018

К сожалению, ERDAS воображать (.img) не поддерживает значения узлов, как GeoTiff или другие форматы, которые определяют маску, чтобы избавиться от них. Как указано в документации API SetNodataValue (), которую вы можете найти здесь , эффект установки значения nodata зависит от драйвера.

Тем не менее, для этого конкретного случая вы можете попробовать это решение (перейти ко второму ответу, предоставленному пользователем Mike T).

...