2017-05-29 10 views
0

skikit learnを使用してRGB画像のマスクを作成しようとしています。緑のチャンネルで[0,10,0]に等しいピクセル、つまり10ピクセルだけを選択してマスクを作成します。そして、それらのピクセルだけを表示します。これは、http://scikit-image.org/docs/dev/user_guide/numpy_images.htmlのようなまっすぐなはずですが、私は苦労しています。画像がロードされたJPGの場合マスクとRGB画像のNumpy/Scipy

することは、私は

mask = image == [0,10,0] 
image = image[mask] 
viewer = ImageViewer(image) 
viewer.show() 

を行うことができますしかし、私が取得:

TypeError: Invalid dimensions for image data 

私は、(マスク)を印刷した場合、私はその代わりに、真の一連の実現各ピクセルでFalseを取得しています。

[[ True False True] 
    [ True False True] 
    [ True False True] 
    ..., 
    [ True False True] 
    [ True False True] 
    [ True False True]] 

画像の最初のピクセルは黒です。だから、それは[0,0,0]と[0,10,0]を比較し、Falseを上げるのではなく、True、False、Trueを出しているようです。

これは、各ピクセルに3つのマスクがあるため、これはマスクとして失敗するようです。

RGB画像でこのマスキングを行うための簡単な方法を知っている人はいますか?

おかげ

+0

あなたの 'image'配列の寸法は、(n、3)の形状と一致しますか? –

+0

いいえそれは(276,274,3) – James

+0

どのようにこれらの特定のピクセルを表示するためにマスクを使用する予定ですか?マスクした後は、高さと幅の2D形式がないためです。 – Divakar

答えて

3

あなたは最後の軸に沿っALL削減と2Dマスクすることを得ることができます -

mask = (image == [0,10,0]).all(-1) 

はその後、image[mask]Nは、どのピクセルの数であるだけ[0,10,0]値の(N,3)形の配列になりますその特定のRGBトリプレットであった。

したがって、maskを使用してマスクされたイメージまたはオーバーレイを表示する手順は、ビューアによって異なります。

image *= mask[...,None] 

またはコピーを作成する - 私たちは、私たちはマスクを掛けることができ、その特定のRGBトリプレットではありませんすべてを隠してしまうような画像でその場編集については、


np.where使用して選んだのメカニズムと - (つまり、ビューアで必要なものの場合) 3Dマスクを取得するには

image_overlayed = np.where(mask[...,None], image, 0) 

を、我々としてもチャンネルに沿ってマスクを複製することができ -

np.repeat(mask[...,None],3,axis=2) 
+0

シェイプを保持して許可するために 'image * mask [...、None]'もできませんでしたか? 'ImageViewer'の使用? –

+0

すごく速いです:P –

+0

@DanielFそこにあなたの心を読む;) – Divakar