我正在使用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并不会总是返回完美的高斯分布,并且一旦算法的其余部分正常运行,我将添加一些误差限制。
答案 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)