使用 PIL 获取像素的 RGB
- 2025-03-07 08:59:00
- admin 原创
- 63
问题描述:
是否可以使用 PIL 获取像素的 RGB 颜色?我正在使用以下代码:
im = Image.open("image.gif")
pix = im.load()
print(pix[1,1])
但是,它只输出一个数字(例如0
或1
),而不是三个数字(例如60,60,60
R、G、B)。我想我对这个函数有些不理解。我希望得到一些解释。
多谢。
解决方案 1:
是的,这样:
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 和 PIL 像素值对于 GIF 和 JPEG 不同,并且此PIL 参考页面 包含有关该convert()
函数的更多信息。
.jpg
顺便说一句,您的代码对于图像来说运行得很好。
解决方案 2:
使用 numpy :
im = Image.open('image.gif')
im_matrix = np.array(im)
print(im_matrix[0][0])
给出位置 (0,0) 像素的 RGB 矢量
解决方案 3:
GIF 将颜色存储为调色板中 x 种可能颜色之一。阅读有关gif 有限调色板的信息。因此,PIL 为您提供的是调色板索引,而不是该调色板颜色的颜色信息。
编辑:删除了包含拼写错误的博客文章解决方案的链接。其他答案也做了同样的事情,但没有拼写错误。
解决方案 4:
转换图像的另一种方法是从调色板创建 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)
解决方案 5:
虽然不是 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!)
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD