2012-06-16 288 views
62

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

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

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

非常感谢。

回答

96

是的,是这样的:

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 and PIL pixel values different for GIF and JPEG和此PIL Reference page包含有关convert()函数的更多信息。

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

+0

可以这样做的计算机屏幕,而不只是一个图像文件? – Musixauce3000

+0

是Image.getpixel()基于0还是基于1?我的意思是,最左上角的像素是(0,0)还是(1,1)? – 2017-11-06 02:39:24

+0

@NimaBavari它是基于0的。 – Nolan

2

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

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

1

转换图像的替代方法是从调色板创建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

不太平,但仍然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