3

グレースケール画像上でいくつかのアルゴリズムによって生成された2Dマスクを使用して2つの3Dnumpy配列(RGB画像配列)を追加したいと思います。これを行うための最良の方法は何ですか?

私がやろうとしていることの例として:

from PIL import Image, ImageChops, ImageOps
import numpy as np

img1=Image.open('./foo.jpg')
img2=Image.open('./bar.jpg')

img1Grey=ImageOps.grayscale(img1)
img2Grey=ImageOps.grayscale(img2)

# Some processing for example:
diff=ImageChops.difference(img1Grey,img2Grey)
mask=np.ma.masked_array(img1,diff>1)

img1Array=np.asarray(im1)
img2Array=np.asarray(im2)

imgResult=img1Array+img2Array[mask]

私は考えていました:
1)RGB画像を分割し、各色を別々に実行します
2)マスクを3D配列に複製します

または、これを行うためのよりPython的な方法はありますか?

前もって感謝します!

4

1 に答える 1

4

回答の代わりにコメントを追加できたらいいのにと思います。とにかく:

masked_arrayはマスクを作成するためのものではありません。これは、合計、平均などの計算にマスク外のデータのみを含めるためのものです。科学的な統計アプリケーション。これは、配列と配列のマスクで構成されています。それはおそらくあなたが望むものではありません。

次のように、通常のブールマスクが必要になる可能性があります。

mask = diff>1

次に、形状を変更して、numpyが正しい次元でブロードキャストし、それを3次元にブロードキャストするようにする必要があります。

mask.shape = mask.shape + (1,)
mask = np.broadcast_arrays(img1Array, mask)[1]

その後、ピクセルを追加するだけです。

img1Array[mask] += img2Array[mask]

さらなる明確化のポイント:

imgResult=img1Array+img2Array[mask]

それは決してうまくいきませんでした。'img2Arrayの一部のピクセルをimg1Arrayのすべてのピクセルに追加する'6_9

2つ以上のアレイ間にufuncを適用する場合は、それらが同じ形状であるか、同じ形状にブロードキャスト可能である必要があります。

于 2012-10-01T02:31:57.627 に答える