我正在使用Python Imaging Library通过一个定义颜色关系的查找表对黑白图像进行着色。查找表只是一个包含256个元素的RGB元组列表:
>>> 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
为53s,getpixel
为50s )
根据文档中的建议,我使用了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]]
处理速度加快了一个数量级,但仍然很慢:处理1024x1024图像大约需要3.5秒。
对PIL文档的更彻底的研究似乎表明,Image.point()
正是为了这个目的:
im.point(table)
=>图像
im.point(function)
=>图像
返回图像的副本,其中每个像素都通过给定表进行了映射。该表应包含图像中每个波段的256个值。如果改用函数,它应该只有一个参数。该函数针对每个可能的像素值调用一次,并将结果表应用于图像的所有波段。
我花了一些时间修改界面,但似乎不能完全理解它。请原谅我的无知,但是PIL的文档很简短,而且我没有太多的图像处理经验。我在谷歌上搜索了一下,找出了一些例子,但没有什么能让我理解"click“这个用法的。因此,最后,我的问题是:
Image.point()
是适合这项工作的工具吗?Image.point()
需要什么样的格式/结构的表?https://stackoverflow.com/questions/2181292
复制相似问题