numpy.interp与掩膜数组

3 投票
1 回答
2025 浏览
提问于 2025-04-16 23:09

我正在使用numpy的掩码数组来处理一些图像。这个掩码是用来处理图像周围的无数据像素(这些像素是必须的,因为这些图像是地图投影的,起点就在一个无数据的像素上)。

通过以下的代码块,我可以对图像进行高斯拉伸处理。

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

如果图像没有无数据的边框,拉伸效果就会如预期那样工作。但是如果图像有掩码,掩码就会被忽略。这是正常现象吗?有没有办法只处理那些没有被掩码的数据呢?

我尝试使用input_array.compressed(),但这只返回了一个一维数组,里面只有未被掩码的值。使用numpy.interp时就会出错,因为数组的大小不匹配。

最后,我明白使用numpy.random.normal并不总是能得到完美的高斯分布,一旦算法的其他部分正常工作,我会添加一些误差范围的限制。

1 个回答

3

你可以先获取输入数组的掩码,然后把这个掩码应用到结果数组上。接着,你可以使用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)

撰写回答