2016-10-07 10 views
0

Что я хочу сделать, это вырезать белые линии над заданным экраном печати instagram. Я попытался сделать это, найдя центр изображения и вставая, по очереди, пока не нашел первую линию полностью белой. Любая идея, почему мой код не работает?Проблемы с обрезкой целых белых линий из файла .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

ОП здесь, большое спасибо! Любые причины, в частности, вы не использовали наборы? Или просто ради простоты? – Rafz

+0

Мне нужно было протестировать его, но в этом случае список может быть быстрее. Вы можете добавить все пиксели в набор, а затем проверить, что в наборе есть одна белая запись. Добавление элементов в набор, вероятно, медленнее, чем добавление элементов в список. Понимание списка добавляет только, если пиксель белый, сам список может содержать что угодно (я решил добавить «1»). Используя список, вы можете, например, проверить, если 95% записей являются белыми, поскольку длина списка пропорциональна количеству белого. –