使用PIL库是否可以获取像素的RGB颜色值?我正在使用以下代码:
im = Image.open("image.gif")
pix = im.load()
print(pix[1,1])
然而,它只输出一个数字(例如0
或1
),而不是三个数字(例如R、G、B的60,60,60
)。我猜我对这个函数的理解还不够。我希望能得到一些解释。
非常感谢。
使用PIL库是否可以获取像素的RGB颜色值?我正在使用以下代码:
im = Image.open("image.gif")
pix = im.load()
print(pix[1,1])
然而,它只输出一个数字(例如0
或1
),而不是三个数字(例如R、G、B的60,60,60
)。我猜我对这个函数的理解还不够。我希望能得到一些解释。
非常感谢。
可以,可以这样做:
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
图像,你的代码可以正常工作。
使用numpy:
im = Image.open('image.gif')
im_matrix = np.array(im)
print(im_matrix[0][0])
给出位置为(0,0)的像素的RGB向量。
GIF图像将颜色存储为调色板中可能的x个颜色之一。阅读有关gif有限色彩调色板的内容。因此,PIL提供给您的是调色板颜色的调色板索引,而不是该调色板颜色的颜色信息。
编辑:已删除博客文章解决方案的链接,该链接存在拼写错误。其他答案也使用相同的方法,但没有拼写错误。
虽然不是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
。 - fbahrfrom 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)