我正在使用一个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并不总是会返回理想的高斯分布,并且一旦算法的其余部分起作用,我将添加一些误差约束.
解决方法:
您可以先获取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)
标签:image-processing,arrays,python,numpy
来源: https://codeday.me/bug/20191208/2088753.html