我正在使用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,则将像素标记为"暗",如果>128 则将像素标记为"亮",那么我需要计算所有暗像素和亮像素,看看图像是否有更多的暗或亮像素。
使用 for 循环这样做是完全错误的吗?
使用 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)