使用 PIL 获取像素的 RGB

是否有可能得到一个像素的 RGB 颜色使用 PIL? 我用的是这个代码:

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

然而,它只输出一个数字(如 01) ,而不是三个数字(如 60,60,60为 R,G,B)。我想我对这个函数有点不太理解。我想听听你的解释。

非常感谢。

260503 次浏览

是的,这边请:

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个值之一。

请看这篇 SO 文章: GIF 和 JPEG 的 Python 和 PIL 像素值不同PIL 参考页包含了更多关于 convert()函数的信息。

顺便说一下,您的代码对于 .jpg图像可以正常工作。

GIF 将颜色存储为调色板中可能的 x 个颜色之一。读读 gif limited color palette。所以 PIL 给出的是调色板索引,而不是该调色板颜色的颜色信息。

编辑: 删除了一个打印错误的博客文章解决方案的链接。其他的答案在没有打错的情况下也能做同样的事情。

转换图像的另一种方法是从调色板创建 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)

不是 PIL,但 imageio.imread可能仍然有趣:

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

给予

(480, 640, 3)

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

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

过时了

scipy.misc.imread 在 SciPy1.0.0中弃用(谢谢提醒,fbahr!)

麻木:

im = Image.open('image.gif')
im_matrix = np.array(im)
print(im_matrix[0][0])

给定位置(0,0)的像素的 RGB 矢量