2011-08-08 4 views
3

いくつかの画像処理を実行するために、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を使用しても必ずしも完全ガウス分布が返ってくるとは限りません。アルゴリズムの残りの部分が機能したら、誤差の余裕を追加します。

答えて

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)