我想为每个像素编写一个基于红色、绿色和蓝色 channel 的点过滤器,但似乎这可能达不到 point() 的能力——它似乎对单个 channel 中的单个像素进行操作一次。我想做这样的事情:

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

有没有一种等效的方法可以让我使用一个过滤器来接收 RGB 值的 3 元组并输出一个新的 3 元组?

最佳答案

您可以使用 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)

关于python - PIL 中是否有 Image.point() 方法可以让您一次对所有三个 channel 进行操作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4529515/

10-16 05:53