Я использую массив маскировок для выполнения некоторой обработки изображений. Маска установлена для обработки пикселей NoData, которые окружают изображение (необходимая граница, так как это проецируемые на карту изображения с началом в пикселе без данных).
Используя следующий кодовый блок, я могу выполнить гауссово растяжение изображения.
def gaussian_stretch(input_array, array_mean, array_standard_deviation, number_of_bins, n):
shape = input_array.shape
input_array = input_array.flatten()
#define a gaussian distribution, get binned GDF histogram
array_standard_deviation *= n
gdf = numpy.random.normal(array_mean, array_standard_deviation, 10000)
hist, bins = numpy.histogram(gdf, number_of_bins, normed=True)
cdf = hist.cumsum()
cdf = 256 * cdf / cdf[-1]
#interpolate and reshape
input_array = numpy.interp(input_array,bins[:-1],cdf)
input_array = input_array.reshape(shape)
return input_array
Если изображение не содержит границы NoData, растяжение работает должным образом. На изображении с маской маска игнорируется. Это ожидаемое поведение? Любые идеи о том, как обрабатывать только немаскированные данные?
Я пытался использовать input_array.compressed (), но это возвращает одномерный массив только немаскированных значений. Использование numpy.interp затем завершается неудачно, как и ожидалось, из-за несоответствия размеров между массивами.
Наконец, я понимаю, что использование numpy.random.normal не всегда будет возвращать идеальное гауссовское распределение, и я добавлю некоторую границу ошибок, как только остальная часть алгоритма заработает.