numpy.interp与掩膜数组
我正在使用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)