使用PIL获取像素的RGB

131

使用PIL库是否可以获取像素的RGB颜色值?我正在使用以下代码:

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

然而,它只输出一个数字(例如01),而不是三个数字(例如R、G、B的60,60,60)。我猜我对这个函数的理解还不够。我希望能得到一些解释。

非常感谢。

5个回答

209

可以,可以这样做:

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图像的像素值,只会获得256个颜色调色板中的一个。

另请参阅这篇 Stack Overflow 帖子:Python和PIL:GIF和JPEG像素值不同。此外,PIL参考页面包含更多关于convert()函数的信息。

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


2
这个能在电脑屏幕上完成吗,而不仅仅是一个图像文件? - Musixauce3000
1
Image.getpixel() 是基于0还是1的?我的意思是,左上角的像素是(0,0)还是(1,1)? - user7969920
2
@NimaBavari 这是基于0的。 - Nolan

9

使用numpy:

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

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


4

GIF图像将颜色存储为调色板中可能的x个颜色之一。阅读有关gif有限色彩调色板的内容。因此,PIL提供给您的是调色板颜色的调色板索引,而不是该调色板颜色的颜色信息。

编辑:已删除博客文章解决方案的链接,该链接存在拼写错误。其他答案也使用相同的方法,但没有拼写错误。


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!)。


注意:scipy.misc.imread已经被弃用!在SciPy 1.0.0中,imread已经被弃用,并将在1.2.0中删除。请改用imageio.imread - fbahr
2
谢谢提醒,fbahr!(实际上我参与了它的弃用 - https://github.com/scipy/scipy/issues/6242) - Martin Thoma

2
创建RGB索引是将图像转换的一种替代方法,可以从调色板中创建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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接