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