【问题标题】:numpy.interp & masked arraysnumpy.interp & 掩码数组
【发布时间】:2011-08-08 19:29:59
【问题描述】:

我正在使用一个 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(),但这会返回一个仅包含未屏蔽值的一维数组。正如预期的那样,由于数组之间的大小差异,使用 numpy.interp 会失败。

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

【问题讨论】:

    标签: python arrays image-processing numpy


    【解决方案1】:

    你可以先得到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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 2012-02-14
      • 1970-01-01
      • 2017-12-31
      • 2019-10-12
      • 1970-01-01
      相关资源
      最近更新 更多