Есть ли в PIL метод Image.point (), который позволяет работать сразу на всех трех каналах? - PullRequest
3 голосов
/ 25 декабря 2010

Я хочу написать точечный фильтр, основанный на красном, зеленом и синем каналах для каждого пикселя, но похоже, что это может не соответствовать возможностям point() - похоже, он работает на одномпиксель в одном канале за раз.Я хотел бы сделать что-то вроде этого:

def colorswap(pixel):
    """Shifts the channels of the image."""
    return (pixel[1], pixel[2], pixel[0])
image.point(colorswap)

Есть ли эквивалентный метод, который позволяет мне использовать фильтр, который принимает 3-х кортеж значений RGB и выводит новый 3-кортеж?

Ответы [ 2 ]

2 голосов
/ 12 января 2011

Вы можете использовать метод load, чтобы получить быстрый доступ ко всем пикселям.

def colorswap(pixel):
    """Shifts the channels of the image."""
    return (pixel[1], pixel[2], pixel[0])

def applyfilter(image, func):
    """ Applies a function to each pixel of an image."""
    width,height = im.size
    pixel = image.load()
    for y in range(0, height):
        for x in range(0, width):
            pixel[x,y] = func(pixel[x,y])

applyfilter(image, colorswap)
2 голосов
/ 12 января 2011

Основываясь на ответах на сегодняшний день, я предполагаю, что ответ будет "нет".

Но вы всегда можете использовать numpy для эффективного выполнения этой работы:

def colorswap(pixel):
    """Shifts the channels of the image."""
    return (pixel[1], pixel[2], pixel[0])

def npoint(img, func):
    import numpy as np
    a = np.asarray(img).copy()
    r = a[:,:,0]
    g = a[:,:,1]
    b = a[:,:,2]
    r[:],g[:],b[:] = func((r,g,b))
    return Image.fromarray(a,img.mode)

img = Image.open('test.png')
img2 = npoint(img, colorswap)
img2.save('test2.png')

Бонус: похоже, класс Image не предназначен только для чтения, что означает, что вы можете сделать вашу новую функцию npoint еще более похожей на point (не рекомендуется, если не сбивает с толку людей):

Image.Image.npoint = npoint

img = Image.open('test.png')
img2 = img.npoint(colorswap)
...