numpy.interp и маскированные массивы - PullRequest
3 голосов
/ 08 августа 2011

Я использую массив маскировок для выполнения некоторой обработки изображений. Маска установлена ​​для обработки пикселей 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 не всегда будет возвращать идеальное гауссовское распределение, и я добавлю некоторую границу ошибок, как только остальная часть алгоритма заработает.

1 Ответ

3 голосов
/ 09 августа 2011

Вы можете сначала получить маску input_array и применить ее к массиву результатов, а также использовать scipy.stats.norm для вычисления cdf нормального распределения или использовать scipy.special.erf () для вычисления cdf с помощью cdf формула нормального распределения:

import scipy.stats as stats    
def gaussian_stretch2(input_array, array_mean, array_standard_deviation, n):
    mask = input_array.mask
    n = stats.norm(array_mean, array_standard_deviation*n)
    return numpy.ma.array(n.cdf(input_array), mask=mask)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...