PIL 使用 eval 函数检查像素是否打开

发布于 2024-11-02 12:01:21 字数 144 浏览 7 评论 0原文

有没有办法使用 PIL 中的 eval 函数来遍历所有像素,同时检查每个值是什么?该程序运行图像以查看每个像素是否是特定的 RGB,如果是,则它将将该像素变成透明。 PIL 中的 eval 函数似乎可以完成这项工作,但是我的转换像素的函数可以检查其所在像素的值吗?提前致谢。

Is there any way using the eval function in PIL to run through all pixels, while checking to see what each value is? The program runs through an image to see if each pixel is a certain rgb, and if it is, then it will turn that pixel into transparency. the eval function in PIL seems it would do the job, but can my function that converts the pixels check the value of the pixel it's on? Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

海的爱人是光 2024-11-09 12:01:21

更新:啊,我明白你想做什么。这是仅使用 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)

Updated: Ahh, I see what you want to do. Here is an example using only PIL. It converts all white pixels to red with 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

Orig answer: Yes, the Image.eval() function lets you pass in a function which evaluates each pixel, and lets you determine a new pixel value:

import Image
img1 = Image.open('foo.png')
# replace dark pixels with black
img2 = Image.eval(img1, lambda px: 0 if px <= 64 else px)
魂归处 2024-11-09 12:01:21

不,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')

No, eval will not pass an RGB tuple to a function. It maps a function over each band. You could, however process each band using eval and then use an ImageChops operation to logically combine the bands and get a mask that will be pixel-tuple specific.

By the way, this could be done much more cleanly and efficiently in NumPy if you are so inclined..

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')
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文