我有这个代码,用于分析一个图像的所有像素值,并使用欧几里德距离公式计算每种颜色是否最接近黑色或白色:
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但我可以有更多......
答案 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
循环之前写入,而不是在所有环路。