Python PIL/Pillow:一个周期用于im.getdata()的多个列表

Python PIL/Pillow:一个周期用于im.getdata()的多个列表,python,python-imaging-library,pillow,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]-2

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

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")
从PIL导入图像
从数学导入sqrt
im=Image.open(“7.jpg”)
尺寸=128128
im.缩略图(大小)
colors=im.getdata()
暗列表=[]
lightlist=[]
暗=0
灯光=0
对于颜色的项目:
如果sqrt((项目[0]-255)**2+(项目[1]-255)**2+(项目[2]-255)**2)len(亮列表):
打印(“此图像为黑色”)
其他:
打印(“此图像很轻”)
现在,我正试图以一种方式扩展这段代码,自动获取文件夹中的所有图像,将它们转换为缩略图,并使用相同的公式逐个分析它们

在多次尝试缩进后编辑,我写了以下内容:

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")
导入全局操作系统
从PIL导入图像
从数学导入sqrt
暗列表=[]
lightlist=[]
暗=0
灯光=0
快乐列表=[]
sadlist=[]
尺寸=128128
对于填充到glob.glob(“*.jpg”):
im=图像。打开(内嵌)
im.缩略图(大小)
文件,ext=os.path.splitext(infle)
im=图像。打开(内嵌)
im.缩略图(大小、图像、抗锯齿)
im.save(文件+“.缩略图”,“JPEG”)
对于填充在glob.glob(“*.缩略图”):
im=图像。打开(内嵌)
colors=im.getdata()
对于颜色的项目:
如果sqrt((项目[0]-255)**2+(项目[1]-255)**2+(项目[2]-255)**2)len(亮列表):
打印(“此图像为黑色”)
其他:
打印(“此图像很轻”)
使用这段代码,我现在有7个不同的输出(文件夹中的每个图像一个输出),但我注意到,在计算每个图像的像素数时,数字并没有加起来。也许黑名单、光名单和他们的计数器有问题


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

对于第二个循环,您可以执行类似的操作,一次对所有像素进行操作(但您仍然必须分别循环每个图像):

将numpy导入为np
导入glob
对于填充在glob.glob(“*.缩略图”):
im=图像。打开(内嵌)
data=np.array(im.getdata())
结果=np.sqrt((数据[…,0]-255)**2+(数据[…,1]-255)**2+
(数据[…,2]-255)**2)

我发现了一个问题:似乎lightlist、darklist及其计数器必须写在
for item in colors
循环的前面,而不是写在所有循环的顶部。

您的问题不清楚:您猜测它同时处理所有值,或者这是您想要的吗?你只是想确认你的猜测吗?你考虑过使用numpy吗?当我调用im.getdata()并询问len(im.getdata())时,我的输出是:
16384 16384(x7)
这是7个列表,每个列表包含16384个项目(每个图像中的像素数)我现在想把我的公式按顺序应用到每个列表中,这样我就有了7个输出,比如:
Total light pixels=*Total dark pixels=*这张图像是暗的(或亮的)
希望我现在更清楚了:)“所以我需要一种方法来分析所有这些图像,而不必逐个打开它们…”我不明白:你已经有了缩略图(毕竟,你只是创建了它们);为什么要重新打开它们?我不明白为什么
im.getdata()
会给你7个列表:3个或4个有意义,每个颜色/alpha通道一个。您将分别在每个图像上循环(
for infle in glob.glob(…)
),从而分别打开每个图像,因此
im.getdata()
仅返回一个图像的数据。我用实际代码编辑了我的问题,因此您可以重现它。我现在没有numpy,我会安装它并试一试!
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>