2011-08-08 55 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)