PIL Проверьте пиксель, что он включен с функцией eval - PullRequest
3 голосов
/ 22 апреля 2011

Есть ли способ использовать функцию eval в PIL для прохождения всех пикселей, одновременно проверяя, что является каждым значением? Программа запускает изображение, чтобы увидеть, является ли каждый пиксель определенным rgb, и если это так, то он превратит этот пиксель в прозрачность. функция eval в PIL, похоже, сработает, но может ли моя функция, которая преобразует пиксели, проверить значение пикселя, на котором она включена? Заранее спасибо.

Ответы [ 2 ]

11 голосов
/ 22 апреля 2011

Обновлено : Ааа, я вижу, что вы хотите сделать. Вот пример использования только PIL. Он преобразует все белые пиксели в красные с 50% альфа:

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 : Да, функция 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)
2 голосов
/ 22 апреля 2011

Нет, 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')
...