我正在使用Python Imaging Library,通过一个定义颜色关系的查找表对黑白图片进行着色。这个查找表是一个由RGB元组组成的256元素列表:
>>> len(colors)
256
>>> colors[0]
(255, 237, 237)
>>> colors[127]
(50, 196, 33)
>>>
我的第一个版本使用了 getpixel()
和 putpixel()
方法:
for x in range(w):
for y in range(h):
pix = img.getpixel((x,y))
img.putpixel((x,y), colors[pix[0]])
这非常慢。一个profile
报告指出putpixel
和getpixel
方法是罪魁祸首。经过一番调查(即读文档),我发现“请注意,此方法相对较慢。”关于putpixel
。(实际运行时:1024x1024图像中的putpixel
需要53秒,getpixel
需要50秒)。根据文档中的建议,我改用
im.load()
和直接像素访问: pixels = img.load()
for x in range(w):
for y in range(h):
pix = pixels[x, y]
pixels[x, y] = colors[pix[0]]
处理速度提高了一个数量级,但仍然缓慢:大约需要3.5秒才能处理一张1024x1024的图像。
对PIL文档进行更彻底的研究似乎表明,Image.point()
恰好是为此目的而设计的:
im.point(table)
=> image
im.point(function)
=> image返回映射到给定表的每个像素的图像副本。 表格应该包含图像中每个带的256个值。 如果使用函数,则应该传入单个参数。 对于每个可能的像素值,都会调用该函数一次,并将生成的表格应用于图像的所有带。
我花了一些时间来试图解决这个接口问题,但似乎无法做到完全正确。 请原谅我的无知,但是PIL的文档很简短,而我没有太多的图像处理经验。 我在Google上搜索了一些例子,但没有一些例子让我真正理解如何使用它。 因此,最终,我的问题是:
Image.point()
是完成这项工作的正确工具吗?Image.point()
需要什么样的表格格式/结构?- 能否提供一个示例实现? 我迄今为止尝试的每个迭代都以纯黑色的图像结束。