2011-05-22 17 views
2

PILを使用して、黒い背景の画像を撮り、そこからマスクを作成しています。私がプログラムにしたいことは、画像内のすべてのピクセルを反復することです。ピクセルが黒であれば白にし、他の色であれば黒にしますが、ピクセル値を適切に比較してピクセルと関係がある。ピクセルをどのように比較しますか?

すべての黒い画像を作成するこれまでのコードです。

import os, sys 
import Image 

filename = "C:\Users\pdiffley\Dropbox\C++2\Code\Test\BallSpriteImage.bmp" 
height = 50 
width = 50 


im = Image.open(filename) 
im = im.load() 

i = 0 
j = 0 
while i<height: 
    while j<width: 
     if im[j,i] == (0,0,0): 
      im[j,i] = (255,255,255) 
     else: 
      im[j,i] = (0,0,0) 
     j = j+1 
    i = i+1 
mask = Image.new('RGB', (width, height)) 
newfile = filename.partition('.') 
newfile = newfile[0] + "Mask.bmp" 

mask.save(newfile) 

私はこの問題は、常にfalseと評価RGB値(0,0,0)にイム[J、I]を比較するif文であると考えています。ピクセルを比較する正しい方法は何ですか?

+0

そうだね。元の画像は間違いなくRGBですか? 'im.mode'をチェックしてください。 "RGB"でない場合は問題です。 – andrewdski

答えて

4

ピクセルデータの比較は正しいです。しかし、ロジックを持つ2つの問題がある:あなたが行で終了したら

  1. は、あなたがオブジェクト「IM」を修正するが、「マスク」を書いている0
  2. にJをリセットする必要があります。

これは(限り、あなたは何のアルファチャンネルを持っていないよう - andrewdskiが指摘したように)動作するはずです:

img = Image.open(filename) 
im = img.load() 

i = 0 
while i<height: 
    j = 0 
    while j<width: 
     if im[j,i] == (0,0,0): 
      im[j,i] = (255,255,255) 
     else: 
      im[j,i] = (0,0,0) 
     j = j+1 
    i = i+1 
newfile = filename.partition('.') 
newfile = newfile[0] + "Mask.png" 

img.save(newfile) 
1

次の関数は、.pointメソッドを使用し、画像の各バンドに個別に動作します:各バンドで個別に作業する

CVT_TABLE= (255,) + 255 * (0,) 

def do_convert(img): 
    return img.point(CVT_TABLE * len(img.getbands())) 

つまり、このような絵: new Battlestar Galactica poster
これに変換されます。
colourful result

しかし、あなたが最初のモード「L」に画像を変換する場合、あなたが望むほとんど何を得ることができます:

CVT_TABLE= (255,) + 255 * (0,) 

def do_convert(img): 
    return img.convert("L").point(CVT_TABLE) 

次の結果生じる:
almost but not quite

唯一の欠点は、いくつかの最も暗い色(例: #000001、可能な限り暗い青)はおそらくモード変換によって黒に変換されます。

+1

みんな、あなたが「この回答は役に立たないと思うから」とdownvoteするとき、理由を説明するコメントを書いてください。 – tzot

1

forループを使用してピクセルインデックスをリセットする問題を回避し、ソースに戻すのではなく別のマスクイメージにデータを書き込み、ハードコードされたイメージサイズを削除します。また、バックスラッシュを処理するために、ファイル名文字列の先頭にrを追加しました。

import os, sys 
import Image 

BLACK = (0,0,0) 
WHITE = (255, 255, 255) 

filename = r"C:\Users\pdiffley\Dropbox\C++2\Code\Test\BallSpriteImage.bmp" 

img = Image.open(filename) 
width, height = img.size 
im = img.load() 

mask = Image.new('RGB', (width, height)) 
msk = mask.load() 

for y in xrange(height): 
    for x in xrange(width): 
     if im[x,y] == BLACK: 
      msk[x,y] = WHITE 
     else: # not really needed since mask's initial color is black 
      msk[x,y] = BLACK 

newfilename = filename.partition('.') 
newfilename = newfilename[0] + "Mask.bmp" 
mask.save(newfilename) 
関連する問題