2016-10-07 1 views
0

私がしたいのは、指定された図版印刷画面の上に白い線を切り取ることです。最初の行が完全に白くなるまで、イメージの中心を見つけて行単位で上に移動してみました。なぜ私のコードがうまくいかないのか?実際にあなたが左端のためにスキャンしたよう.pngファイルから白線全体を切り抜くときの問題

from PIL import Image 

image_file = "test.png" 
im = Image.open(image_file) 
width, height = im.size 
centerLine = height // 2 

entireWhiteLine = set() 
entireWhiteLine.add(im.getpixel((0, 0))) 
terminateUpperCrop = 1 

while terminateUpperCrop != 2 : 

    for i in range(centerLine, 1, -1) : 
     entireLine = set() 
     upperBorder = i - 1 
     for j in range(0, width, 1) : 
      entireLine.add((im.getpixel((i, j)))) 
      if entireLine == im.getpixel((0,0)): 
       box = (0, upperBorder, width, height) 
       crop = im.crop((box)) 
       crop.save('test2.png') 
       terminateUpperCrop = 2 
+0

あなたの質問に答えようとしている人を助けるのに便利なことは、あなたのコードが現在行っていることとあなたがしたいことがどのように異なるかを記述することです。あなたのテストを共有することも役に立ちます。 – JamesStewy

答えて

0

あなたgetpixel()呼び出しは、実際に、間違った方法を中心にして座標で検索されます。次の方法を使用することができます。これにより、白いピクセルのみを含むデータの行が作成されます。行の長さがあなたの幅と等しい場合、それらはすべて白であることがわかります。

from PIL import Image 

image_file = "test.png" 
im = Image.open(image_file) 
width, height = im.size 
centerLine = height // 2 

white = (255, 255, 255) 

for y in range(centerLine, 0, -1) : 
    if len([1 for x in range(width) if im.getpixel((x, y)) == white]) == width - 1: 
     box = (0, y, width, height) 
     crop = im.crop((box)) 
     crop.save('test2.png') 
     break 
+0

OPこちら、どうもありがとう! 特にセットを使用しなかった理由は何ですか?それとも単純化のために? – Rafz

+0

私はそれをテストする必要がありますが、この場合はリストが速くなるかもしれません。すべてのピクセルをセットに追加してから、そのセットに1つの白い入力があることをテストすることができます。セットにアイテムを追加するほうがリストにアイテムを追加するよりもおそらく遅くなります。リスト内包は、ピクセルが白である場合にのみ追加され、リスト自体には何も含めることができます(私は '1'を追加することを選択しました)。リストの長さが白の量に比例するので、エントリの95%が白であるかどうかをテストすることができます。 –

関連する問題