2015-01-06 1 views
-1

У меня есть этот код, который анализирует для одного изображения все значения пикселей и вычисляет, если каждый цвет близок к черному или белым с формулой расстояния Евклида:PIL/Pillow: один цикл для нескольких списков im.getdata()

from PIL import Image 
from math import sqrt 
im=Image.open("7.jpg") 
size=128,128 
im.thumbnail(size) 
colors=im.getdata() 
darklist=[] 
lightlist=[] 
dark=0 
light=0 
for item in colors: 
    if sqrt((item[0]-255)**2 + (item[1]-255)**2 + (item[2]-255)**2) < sqrt((item[0]-0)**2 + (item[1]-0)**2 + (item[2]-0)**2): 
     lightlist.append(item) 
     light+=1 
    else: 
     darklist.append(item) 
     dark+=1 
print ("Total light pixels=",light) 
print ("Total dark pixels=",dark) 

if len(darklist) > len(lightlist): 
    print ("This image is DARK") 
else: 
    print ("This image is LIGHT") 

Сейчас я пытаюсь расширить этот код таким образом, он автоматически принимает все изображения в папке, преобразующие их эскизы и анализирует их по одному с этой же формулой.

EDIT после различных попыток с отступом, я писал:

import glob, os 
from PIL import Image 
from math import sqrt 
darklist=[] 
lightlist=[] 
dark=0 
light=0 
happylist=[] 
sadlist=[] 
size=128,128 
for infile in glob.glob("*.jpg"): 
    im=Image.open(infile) 
    im.thumbnail(size) 
    file, ext = os.path.splitext(infile) 
    im = Image.open(infile) 
    im.thumbnail(size, Image.ANTIALIAS) 
    im.save(file + ".thumbnail", "JPEG") 
for infile in glob.glob("*.thumbnail"): 
    im=Image.open(infile) 
    colors=im.getdata() 
    for item in colors: 
     if sqrt((item[0]-255)**2 + (item[1]-255)**2 + (item[2]-255)**2) < sqrt((item[0]-0)**2 + (item[1]-0)**2 + (item[2]-0)**2): 
      lightlist.append(item) 
      light+=1 
     else: 
      darklist.append(item) 
      dark+=1 
    print ("Total light pixels=",light) 
    print ("Total dark pixels=",dark) 
    if len(darklist) > len(lightlist): 
     print ("This image is DARK") 
    else: 
     print ("This image is LIGHT") 

С помощью этого кода теперь у меня есть 7 различных выходов (по одному для каждого изображения в моей папке), но я заметил, что эти цифры не» t складывается при подсчете количества пикселей каждого изображения. Может быть, что-то не так с darklist, lightlist и их счетчики.

Моя общая проблема: как применить формулу евклидовой дистанции к каждому изображению в папке? Теперь у меня есть 7, но я мог бы иметь гораздо больше ..

+0

Ваша проблема непонятна: вы предполагаете, что она работает одновременно со всеми значениями одновременно или это то, что вы хотите *? Вы просто хотите подтвердить свою догадку? – Evert

+0

Считаете ли вы использование numpy? – Evert

+0

Когда я называю im.getdata() и задать LEN (im.getdata()) мой вывод: '16384 16384 (x7)' , что 7 списки 16384 пунктов каждый (количество пикселей в каждом image) Я хотел бы теперь применить мою формулу к каждому списку последовательно таким образом, чтобы у меня было 7 выходов: 'Всего пикселей: = Всего темных пикселей = * Это изображение ТЕМНОЕ (или СВЕТ)' Надежда Теперь я был более ясен :) – Mikhaylova

ответ

0

Для второго цикла, вы можете сделать что-то вроде этого, чтобы работать на все пиксели сразу (но вам все равно придется перебрать каждое изображение отдельно):

import numpy as np 
import glob 
for infile in glob.glob("*.thumbnail"): 
    im=Image.open(infile) 
    data = np.array(im.getdata()) 
    result = np.sqrt((data[..., 0] - 255)**2 + (data[..., 1] - 255)**2 + 
        (data[..., 2] - 255)**2) 
    <etc> 
+0

Я отредактировал мой вопрос с фактическим кодом, чтобы вы могли воспроизвести его. Сейчас у меня нет numpy, я его установлю и попробую! – Mikhaylova

0

Я нашел эту проблему: похоже, lightlist, darklist и их счетчики должны быть написаны прямо перед циклом for item in colors и не поверх всех петель.

 Смежные вопросы

  • Нет связанных вопросов^_^