いくつかの画像処理を実行するために、numpy masked arrayを使用しています。マスクは、画像を囲むNoDataピクセルを処理するための場所にあります(必要な境界線は、データピクセルがない原点を投影した投影画像です)。numpy.interp&masked arrays
次のコードブロックを使用して、イメージにガウス・ストレッチを実行できます。
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を使用しても必ずしも完全ガウス分布が返ってくるとは限りません。アルゴリズムの残りの部分が機能したら、誤差の余裕を追加します。