计算列表中每个项目的欧几里德距离

时间:2014-12-23 12:28:24

标签: python python-imaging-library pixels pillow euclidean-distance

我正在使用Pillow和Python 3.3,对于我拥有的每个图像,我想分析所有像素颜色并计算每种颜色是否最接近白色或黑色。我已经尝试过欧几里德距离这个公式:

>>>a,b=(127,255) #color value of pixel at position (1,1)
>>>whitedist=sqrt((a-255)**2 + (b-255)**2)
>>>print (whitedist)
128.0

像素有两个值,因为我正在使用灰度图像。 问题是我无法对128x128图像的每个像素执行此操作,因此我尝试编写第一个“for”循环:

colors=im.getdata() #all pixel values
for item in col:
    for item in range (0, 127):
    print ("B") #if the value is between 0 and 127 the color is nearer to black

这是一个完全愚蠢的尝试,python进入了一个无限循环,我不得不退出它。我的问题是我对如何做有一个原始的想法,但我不太了解python将我的推理转化为代码。我认为我的理由并非完全错误,但我找不到将其翻译成代码的方法。

由于list(im.getdata())返回一个元组列表,每个像素包含两个值的一个元组,我认为我应该做的是将公式whitedist=sqrt((a-255)**2 + (b-255)**2)应用于每个元组,如果结果公式为< 128,将像素标记为“暗”,如果> 128然后将像素标记为“光”,则我需要计算所有暗和亮像素并查看图像是否具有更多暗或亮像素

使用for循环执行此操作是完全错误的吗?

2 个答案:

答案 0 :(得分:2)

使用getdata可以检索所有像素,因此如果图像大小为128 x 128,则表示16384像素。如上所述,它们以变量颜色存储为16384个值。

您可以通过一个循环遍历整个值:

for item in colors:
  whitedist=sqrt((item[0]-255)**2 + (item[1]-255)**2)
  if whitedist <= 128:
     darkPixels++
  else:
     lightPixels++  

如果你知道如何表示颜色,你可以像你提到的那样计算欧几里德距离。请注意,如果值为128,则未指定todo,以及如何存储标记。如果只需要知道有多少像素是暗的还是亮的,你可以使用上面的例子。

答案 1 :(得分:1)

试试这个:

colors = im.getdata() #all pixel values
# initialize lists for dark and light pixels
darkList=[]   
lightList=[]
# set counter for dark and light pixels
dark = 0  
light = 0  
for item in colors:  # iterate over each tuple
    if sqrt((item[0]-255)**2 + (item[1]-255)**2) < 128:  # See if Euclidean distance is less than 128
        lightList.append(item)  # append pixel to light pixel list
        light+=1   # increment light pixel counter
    else:
        darkList.append(item)  # append pixel to dark pixel list
        dark+=1   # increment dark pixel counter

print("Total light pixels =",light)
print(lightList)
print("Total dark pixels =",dark)
print(darkList)