PIL:如何获得RGB的调色板索引



我想迭代PNG图像(我用imagemagik创建的(中给定颜色的所有像素。迭代部分我可以处理,但该图像使用调色板,所以我需要获得给定颜色的调色板索引,在我的例子中是白色。通常,这应该与函数ImagePalette.getcolor()一起使用,但这告诉我调色板处于原始模式,我不知道如何禁用。我的做法如下,但必须有一个更简单的方法。

import sys
from PIL import Image
import numpy as np
image = Image.open( sys.argv[1] )
width, height = image.size
# image.palette.getcolor( (255,255,255) ) # gives ValueError: palette contains raw palette data
palette = image.getpalette() # a list
palette = np.reshape( palette, (-1, 3) )
#rows255, _cols255 = np.where( palette == (255,255,255) ) # gives the same as below - apparently or'ing
rows255, _cols255 = np.where( palette == 255 )
whites = []
count = 1
prev = -1
for r in rows255:
if r==prev:
count += 1
else:
count = 1
if count==3:
whites.append( prev )
prev = r
print(whites)

所以我感兴趣的是直接用pil来做这件事,或者对元组正确地使用numpy.where()

每个带有调色板的图像的情况都应该是一样的,但这是我的一个文件:https://i.stack.imgur.com/7WRld.jpg

我不确定你的问题到底是什么,也不确定你想做什么。我想你想得到与白色相对应的调色板条目的索引。

# Open image
image = Image.open('image.png')
# Extract palette and reshape to 256x3 RGB entries
palette = image.getpalette()
palette = np.reshape( palette, (-1, 3) )

然后这告诉你哪些调色板条目是白色的,即第一个和最后一个:

np.all(palette==255,axis=-1)
Out[34]: 
array([ True, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False,  True])

或者你可能想要这个,这告诉你同样的事情,即第一个和最后一个条目是白色的:

np.where(np.all(palette==255,axis=-1)) 
Out[35]: (array([  0, 255]),)

最新更新