numpy.interp&蒙面数组

时间:2011-08-08 19:29:59

标签: python arrays image-processing numpy

我正在使用numpy蒙面数组来执行一些图像处理。掩模适用于处理围绕图像的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(),但这会返回仅包含未屏蔽值的1D数组。然后使用numpy.interp失败,正如预期的那样,因为数组之间的大小差异。

最后,据我所知,使用numpy.random.normal并不会总是返回完美的高斯分布,并且一旦算法的其余部分正常运行,我将添加一些误差限制。

1 个答案:

答案 0 :(得分:3)

首先可以获取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)