PIL / Pillow:im.getdata()的多个列表的一个循环

时间:2015-01-06 08:55:31

标签: python python-imaging-library pillow

我有这个代码,用于分析一个图像的所有像素值,并使用欧几里德距离公式计算每种颜色是否最接近黑色或白色:

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")

现在我尝试扩展此代码的方式是自动获取文件夹中的所有图像,将它们转换为缩略图并使用相同的公式逐一分析它们

经过各种缩进尝试后,

编辑,我写道:

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种不同的输出(我的文件夹中的每个图像都有一个)但是我注意到在计算每个图像的像素数时,这些数字并没有加起来。也许黑名单灯光列表及其计数器出现了问题。

我的一般问题是:如何将欧几里德距离公式应用于文件夹中的每个图像?现在我有7但我可以有更多......

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

我发现问题:似乎 lightlist darklist ,他们的计数器必须在for item in colors循环之前写入,而不是在所有环路。