2012-04-30 3 views
0

Я пытаюсь сортировать пиксели изображений в порядке значений RGB. Будучи новичком в Python, я пробовал это:Медленная обработка изображений с Python и PIL

from PIL import Image 

source = Image.open("source.jpg") 
colors = source.getcolors(source.size[0] * source.size[1]) #maxcolor value =256, get all colors with source.size[0] * source.size[1] 
pixels = [] 
for i, color in colors: 
    pixels.extend(i * [color]) 
    pixels.sort() 
    new = Image.new('RGB', source.size) 
    new.putdata(pixels) 
    new.save("new.png") 

Он хорошо работает для небольших файлов размером около 40x40 пикселей. Но цель состояла в том, чтобы использовать его на фотографиях с разрешением до 3000х2000, я попытался запустить его, но через два часа все еще не было конца. Можно ли оптимизировать код, сделал ли я что-то совершенно неправильно или Python просто не подходит для такого рода задач?

ответ

5

Отступ в Python является ключом, иначе вы можете запускать код, который вы бы не использовали для каждой итерации.

Здесь вы сохраняете свой файл каждый раз, когда вы зацикливаете, когда ваше изображение имеет отступ. Вместо этого попробуйте:

from PIL import Image 

source = Image.open("source.jpg") 
colors = source.getcolors(source.size[0] * source.size[1]) #maxcolor value =256, get all colors with source.size[0] * source.size[1] 
pixels = [] 
for i, color in colors: 
    pixels.extend(i * [color]) 
pixels.sort() 
new = Image.new('RGB', source.size) 
new.putdata(pixels) 
new.save("new.png") 
1

список вы получите обратно из getcolors могут быть отсортированы непосредственно, то все, что вам нужно сделать, это восстановить образ из него.

colors = source.getcolors(source.size[0] * source.size[1]) 
colors.sort(key=lambda pair: pair[1]) 

Кроме того, как Boud mentioned, обратите внимание на то, что внутри цикла.

+0

Я тоже пробовал, но возникла проблема с тем, что восстановление изображения не сработало. Я попробовал: new.putdata (colors), но это возвращает TypeError. – dan

+0

@dan, у вас уже был код для правильной сборки изображения из списка цветов, поэтому я не включил его в ответ. Все, что вам нужно было сделать, это удалить «sort». –