PIL使用eval函数检查它所在的像素

时间:2011-04-21 21:06:10

标签: python transparency python-imaging-library rgb pixel

有没有办法在PIL中使用eval函数来遍历所有像素,同时检查每个值是什么?程序通过一个图像来查看每个像素是否是某个rgb,如果是,则它会将该像素转换为透明度。 PIL中的eval函数似乎可以完成这项工作,但是我的转换像素的函数可以检查它所在像素的值吗?提前谢谢。

2 个答案:

答案 0 :(得分:11)

更新了:啊,我明白了你想做什么。这是仅使用PIL的示例。它将所有白色像素转换为红色,50%alpha:

import Image

img = Image.open('stack.png').convert('RGBA')
width, _ = img.size
for i, px in enumerate(img.getdata()):
    if px[:3] == (255, 255, 255):
        y = i / width
        x = i % width
        img.putpixel((x, y), (255, 0, 0, 127))

img.save('stack-red.png')

original
converted

原始回答:是的,Image.eval()函数允许您传入一个评估每个像素的函数,并让您确定一个新的像素值:

import Image
img1 = Image.open('foo.png')
# replace dark pixels with black
img2 = Image.eval(img1, lambda px: 0 if px <= 64 else px)

答案 1 :(得分:2)

不,eval不会将RGB元组传递给函数。它在每个波段上映射一个函数。但是,您可以使用eval处理每个波段,然后使用ImageChops操作在逻辑上组合波段并获得一个特定于像素元组的掩码。

顺便说一句,如果您愿意,可以在NumPy中更加干净和高效地完成这项工作。

import numpy as np
import Image
import ImageChops
im_and = ImageChops.lighter

im = Image.open('test.png')
a = np.array(im)

R,G,B,A = im.split()

color_matches = []
for level,band in zip((255,255,255), (R,G,B)):
    b = Image.eval(band, lambda px: 255-(255*(px==level)))
    color_matches.append(b)

r,g,b = color_matches
mask = im_and(r, im_and(g, b))
im.putalpha(mask)
im.save('test2.png')