使用PIL获取像素的RGB


93

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

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

但是,它仅输出一个数字(例如01),而不输出三个数字(例如60,60,60对于R,G,B)。我想我对功能不了解。我想解释一下。

非常感谢。

Answers:


147

是的,这样:

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图像正常工作。


1
可以在计算机屏幕上完成操作,而不仅仅是图像文件吗?
Musixauce3000 '16

1
Image.getpixel()是基于0还是基于1?我的意思是,最左上角的像素是(0,0)还是(1,1)?

2
@NimaBavari从0开始。
诺兰

3

GIF将颜色存储为调色板中x种可能颜色中的一种。阅读有关gif受限调色板的信息。因此,PIL为您提供调色板索引,而不是该调色板颜色的颜色信息。

编辑:删除了具有错字的博客帖子解决方案的链接。其他答案也做同样的事情,没有错字。


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)

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


PSA:scipy.misc.imread已弃用!imread在SciPy 1.0.0中已弃用,在1.2.0中将被删除。使用imageio.imread代替。
fbahr

1
感谢您的提醒,fbahr!(其实我是参与了废除了它- github.com/scipy/scipy/issues/6242 🙈)
马丁托马
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.