2016-05-20 5 views
1

私はRGBAのPILイメージを2つ持っています。私は何をしたいのRGB値が同じであるすべての場所を見つけることで、アルファは、それはこのようになります255です:Numpyで配列のサイズを変えてどこを使うか

from PIL import Image 
import numpy as np 
img1 = np.array(Image.open(/path/to/img1).convert('RGBA'), float).reshape(32,32,4) 
img2 = np.array(Image.open(/path/to/img2).convert('RGBA'), float).reshape(32,32,4) 

# Checks to see if RGB of img1 == RGB of img2 in all locations that A=255 
np.where((img1[:,:,:-1] == img2[:,:,:-1]) &\ # RGB check 
     (img1[:,:,3] == 255)) # Alpha check 

しかし、これはoperands could not be broadcast together with shapes (32,32,3) (32,32)になります。
私はそれらを一緒に放送しようとは思わなかった、私はちょうど私がこの声明でそれらを放送すると思うindecesを見つけることを望んでいた。これを行う別の方法があるか、または不等形をブロードキャストしない方法がありますか?

+1

'img1 [:,:、:-1]'は、形状が '32、32、3'の配列になります。 'img1 [:,:、3]'は、形状が '32,32'の配列になります。 – mgilson

+0

@mgilsonはい私は知っています。しかし、私は明確に達成しようとしているのですか?私は、 'np.where'が複数の" where "ステートメントを一緒にブロードキャストしないようにすると考えていたので、上記がうまくいくと思いました – ZWiki

+0

そして、少しスタイルを指摘するために、ここで行継続の' \ 'は不要です。 Pythonは、非中括弧、角括弧、かっこ内にある行を連結します(ここではそうです)。実際、PEP 8( "公式"スタイルガイド)は、行を続けるにはカッコを使用し、行継続には '\ 'を使用することを推奨していません。 – mgilson

答えて

3

使用.all(axis=-1)は、3つのすべてのRGB値が等しい位置を見つけるために:

np.where((img1[..., :-1] == img2[..., :-1]).all(axis=-1) 
     & (img1[..., 3] == 255)) 

mgilson points outとして、(img1[..., :-1] == img2[..., :-1])(32, 32, 3)形状有します。 .all(axis-1)を呼び出すと、そう

(img1[..., :-1] == img2[..., :-1]).all(axis=-1) 

(32, 32)を形作るあり、スカラーブール値に最後の軸を低減します。これは形状が(img1[..., 3] == 255)に一致するため、これらのブール値配列はbitwise-and operator, &と組み合わせることができます。

+2

+1私は最後の軸に沿った削減は、OPが求めているものだと思います。 OPがアルファ値も同じであることを確認したいのではないかと思っています...(この場合、省略記号なしで '(img1 == img2).all(axis = -1)'に簡略化されます) – mgilson

+0

恐ろしいです!これはまさに私が望んでいたものです。そしてyes @ mgilson私はアルファチェックを得るためにあなたも追加することができました。ありがとう! – ZWiki

+0

また、 '&'は論理演算子でも演算子でもないことを指摘します(ただし、頻繁に使用されます)。右辺と左辺の両方が論理配列であれば、論理の配列を返すのは特殊な_binary_ '&'演算子です。 _logical_については、常に 'np.logical_and'を使用することをお勧めしています('& '演算子が時にはそれを使用しようとしている人に噛み付く優先順位の問題はありません)... – mgilson

関連する問題