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

2024-09-30 16:23:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python3.3中使用Pillow,对于每个图像,我要分析所有像素的颜色,并计算每种颜色是否最接近白色或黑色。我试过用欧几里德距离公式:

>>>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”循环:

^{pr2}$

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

自列表(即时获取数据())返回一个元组列表,每个像素一个元组包含两个值,我想我应该做的是将公式whitedist=sqrt((a-255)**2 + (b-255)**2)应用到每个元组,如果公式的结果是<;128,则将像素标记为“dark”;如果>;128,则将像素标记为“light”,然后我需要计算所有暗像素和浅色像素,并查看图像有更多的深色或浅色像素。在

用for循环这样做是完全错误的吗?在


Tags: 代码标记图像列表for颜色错误像素
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,您没有指定要执行的操作,以及要如何存储标记。如果只需要知道有多少像素是暗的还是亮的,可以使用上面的例子。在

试试这个:

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)

相关问题 更多 >