使用PIL获取像素的RGB

是否有可能使用PIL获取像素的RGB颜色? 我正在使用这个代码:

im = Image.open("image.gif") pix = im.load() print(pix[1,1]) 

但是,它只输出一个数字(例如01 )而不是三个数字(例如R,G,B为60,60,60 )。 我想我不了解这个function。 我想要一些解释。

非常感谢。

是的,这样:

 im = Image.open('image.gif') rgb_im = im.convert('RGB') r, g, b = rgb_im.getpixel((1, 1)) print(r, g, b) (65, 100, 137) 

你以前得到一个单一值的原因与pix[1, 1]是因为GIF像素引用GIF调色板中的256个值之一。

另请参阅此SOpost: 对于GIF和JPEG , Python和PIL像素值不同 ,此PIL参考页面包含有关convert()函数的更多信息。

顺便说一下,你的代码对于.jpg图像来说工作得很好。

GIF将颜色存储为调色板中x个可能颜色之一。 阅读有关gif有限的调色板 。 所以PIL给你的调色板索引,而不是调色板颜色的颜色信息。

编辑:删除了有错误的博客文章解决scheme的链接。 其他答案没有打字错误也是一样的。

不是PIL,但scipy.misc.imread可能仍然很有趣:

 import scipy.misc im = scipy.misc.imread('um_000000.png', flatten=False, mode='RGB') print(im.shape) 

 (480, 640, 3) 

所以它是(高度,宽度,通道)。 所以位置(x, y)处的像素是

 color = tuple(im[y][x]) r, g, b = color 

转换图像的替代方法是从调色板创build一个RGB索引。

 from PIL import Image def chunk(seq, size, groupByList=True): """Returns list of lists/tuples broken up by size input""" func = tuple if groupByList: func = list return [func(seq[i:i + size]) for i in range(0, len(seq), size)] def getPaletteInRgb(img): """ Returns list of RGB tuples found in the image palette :type img: Image.Image :rtype: list[tuple] """ assert img.mode == 'P', "image should be palette mode" pal = img.getpalette() colors = chunk(pal, 3, False) return colors # Usage im = Image.open("image.gif") pal = getPalletteInRgb(im)