2011-08-08 126 views
3

我使用numpy的屏蔽數組執行一些圖像處理。掩模就位處理其包圍圖像(必要邊界,因爲這些都是與在無數據的像素原點地圖投影圖像)無數據像素。numpy.interp&掩蔽陣列

使用下面的代碼塊,我能夠對圖像執行高斯拉伸。

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不會總是返回一個完美的高斯分佈,一旦算法的其餘部分是否正常工作,我將添加錯誤約束上的一些餘量。

回答

3

您可以首先獲得input_array的掩碼,並將其應用於結果數組,然後使用scipy.stats.norm計算正態分佈的cdf,或者可以使用scipy.special.erf()來計算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)