111

是否可以使用 PIL 获得像素的 RGB 颜色?我正在使用这段代码:

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

但是,它只输出一个数字(例如0or 1)而不是三个数字(例如60,60,60R、G、B)。我想我不了解该功能。我想要一些解释。

非常感谢。

4

5 回答 5

182

是的,这样:

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 帖子:Python 和 PIL 像素值对于 GIF 和 JPEG 不同,此PIL 参考页面 包含有关该convert()函数的更多信息。

顺便说一句,您的代码可以很好地处理.jpg图像。

于 2012-06-16T15:52:09.373 回答
4

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

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

于 2012-06-16T15:52:49.763 回答
2

转换图像的另一种方法是从调色板创建一个 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)
于 2016-07-07T20:11:31.753 回答
2

不是 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在 SciPy 1.0.0 中已弃用(感谢提醒,fbahr!)

于 2016-07-24T09:02:55.227 回答
2

使用 numpy :

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

给出位置 (0,0) 像素的 RGB 向量

于 2020-08-27T17:27:36.340 回答