2

288x288 ndarrays の形式で 5 つのグレースケール画像があります。それぞれの値は、0.0 から 255.0 までの数値ですndarraynumpy.float32ごとに、次のようにオブジェクトをndarray作成しました。numpy.ma.MaskedArray

def bool_row(row):
    return [value == 183. for value in row]

mask = [bool_row(row) for row in nd_array_1]
masked_array_1 = ma.masked_array(nd_array_1, mask=mask)

183.は、画像内の「ゴミ」を表します。5枚の画像すべてに少し「ゴミ」があります。マスクされた画像の中央値を取得したいのですが、各ポイントの中央値を取得すると、マスクされた値は無視されます。結果は、ガベージのない正しいイメージになります。

私がしようとすると:

ma.median([masked_array_1, masked_array_2, masked_array_3, masked_array_4, masked_array_5], axis=0)

マスクされた値を無視するのではなく、それらを として扱うことを除いて、中央値のように見えるものを取得する183.ため、結果にはすべての写真からのゴミが重なっています。2 つのマスクされた画像の中央値を取ると、次のようになります。

ma.median([masked_array_1, masked_array_2], axis=0)

正しいことを始めたように見えますが183.、マスクされた両方の配列にMaskedConstant.

ma.median次のようなことができますが、おそらく期待どおりに動作させる方法があると思います。

unmasked_array_12 = ma.median([masked_array_1, masked_array_2], axis=0)
mask = [bool_row(row) for row in unmasked_array_12]
masked_array_12 = ma.masked_array(unmasked_array_12, mask=mask)

unmasked_array_123 = ma.median([masked_array_12, masked_array_3], axis=0)
mask = [bool_row(row) for row in unmasked_array_123]
masked_array_123 = ma.masked_array(unmasked_array_123, mask=mask)

...

ma.median上記の不快感に頼らずに期待どおりに動作させるにはどうすればよいですか?

4

4 に答える 4

0

起動するnumpy関数の巧妙なシーケンスを見つければ、それを実行できると確信しています。しかし、単純に行うこともできます。

def merge(a1, a2):
    result = []
    for x, y in zip(a1, a2):
        if x == 183:
            x = y
        result.append(x)
    return result

array_1 = [1, 183, 2]
array_2 = [1, 183, 183]
array_3 = [183, 4, 2]

print merge(merge(array_1, array_2), array_3)

結果の実行が非常に遅い場合は、CPython の代わりに PyPy で同じコードを試すことができます。

于 2013-09-09T10:01:05.907 に答える
0

あなたが求めているのは、すべてのピクセルの非 nan 値をフェッチすることである場合、次の行に沿って何かを行うことができます。

stacked_imgs = np.dstack((img1, img2, img3))
mask = stacked_imgs == 183
# Find the first False, i.e. non-183 entry, along stack axis
index = np.argmin(mask, axis=-1)
correct_image = stacked_image[..., index]

特定のピクセルの 183 以外のすべてのエントリが常に同じである場合、これにより目的の結果が得られます。

于 2013-09-09T13:08:39.703 に答える