是否可以使用PIL获取像素的RGB颜色? 我正在使用此代码:
im = Image.open("image.gif")
pix = im.load()
print(pix[1,1])
但是,它只输出一个数字(例如0
或1
)而不是三个数字(例如,对于R,G,B,60,60,60
)。我想我不了解这个功能。我想要一些解释。
非常感谢。
答案 0 :(得分:121)
是的,这样:
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
图片。
答案 1 :(得分:3)
GIF将颜色存储为调色板中x种可能颜色之一。阅读gif limited color palette。因此PIL会为您提供调色板索引,而不是调色板颜色的颜色信息。
编辑 删除了有拼写错误的博客文章解决方案的链接。如果没有拼写错误,其他答案也会做同样的事情。
答案 2 :(得分: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
答案 3 :(得分: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)
答案 4 :(得分:0)
使用numpy:
im = Image.open('image.gif')
im_matrix = np.array(im)
print(im_matrix[0][0])
给出位置(0,0)的像素的RGB矢量