【问题标题】:Calculate Euclidean distance for each item in a list计算列表中每个项目的欧几里得距离
【发布时间】:2014-12-23 12:28:23
【问题描述】:

我在 Python 3.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”循环:

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则将像素标记为“亮”,那么我需要计算所有暗像素和亮像素,看看图像是否有更多暗像素或亮像素。

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

【问题讨论】:

  • “像素有两个值,因为我正在处理灰度图像。” 你确定吗?我认为灰度图像只有一个通道,而不是两个。三通道图像对于红色、绿色和蓝色强度各有一个数字;一个通道图像的亮度只有一个数字。两个数字代表什么?
  • 我确定它是灰度的,因为我之前对其进行了转换,但我不确定这两个数字代表什么。每个像素有两个数字,但第二个总是255,所以第一个应该是你说的亮度......
  • 也许第一个数字是亮度,第二个是透明度,那么。如果是这样,255 在这种情况下只是意味着“不透明”。
  • 我在处理图像时会使用 numpy 解决方案

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


【解决方案1】:

使用 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,您没有指定待办事项,以及您希望如何存储标签。如果只需要知道多少像素是暗的还是亮的,你可以使用上面的例子。

【讨论】:

  • 谢谢@Maverick2k。我想我现在会忽略值 128,或者我可以考虑将其标记为“中性”
【解决方案2】:

试试这个:

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)

【讨论】:

  • 谢谢,它有效!如果我想使用 RGB 值,我想我只需要将公式更改为 sqrt((item[0]-255)**2 + (item[1]-255)**2 + (item[3]-255 )**2),对吗?
  • 正确,但请确保 RGBim.getdata() 返回长度为 3 的元组。
猜你喜欢
  • 1970-01-01
  • 2020-11-29
  • 2018-02-14
  • 2014-10-27
  • 1970-01-01
  • 2013-04-07
  • 2021-01-31
  • 2015-09-23
  • 1970-01-01
相关资源
最近更新 更多