使用PIL和Image.point进行像素到像素编辑

时间:2013-11-02 00:01:39

标签: python image-processing python-imaging-library

我似乎无法理解Image点的作用。我想做一些像素编辑,其中可能包括检查每个像素中哪个颜色值(r,g或b)最大并相应地采取行动。让我们说我不能使用numpy。我设法使用Image point为图像中的每个像素添加相同的值。 点代码

import Image, math

def brightness(i, value):
value = math.floor(255*(float(value)/100))
return i+value

if __name__ == '__main__':
    image = '/home/avlahop/verybig.jpg'
    print image
    img = Image.open(image)
    print img
    out = img.point(lambda i: brightness(i, 50))
    out.show()

numpy code

def brightness(arr, adjust):
    import math
    adjust = math.floor(255*(float(adjust)/100))


    arr[...,0] += adjust
    arr[...,1] += adjust
    arr[...,2] += adjust
    return arr

if __name__ == '__main__':
    image = '/home/avlahop/verybig.jpg'
    img = Image.open(image).convert('RGBA')
    arr = np.array(np.asarray(img).astype('float'))
    new_image = Image.fromarray(brightness(arr, adjust).clip(0,255).astype('uint8'), 'RGBA').show()

我不得不说点代码比numpy快。但是如果我想用点进行更复杂的操作呢?例如,对于每个像素,检查max(r,g,b)并根据r = max或g = max或b = max来做某事。如你所见,我用函数作为参数。我需要一个论点。这是什么我?它是像素吗?(即i =(r,g,b)?)。我似乎无法从pil文件中理解

1 个答案:

答案 0 :(得分:0)

在早期版本的PIL中,文档可能并不清楚,但在Pillow中,它的拼写非常清楚。来自Image.point

  

lut - 一个查找表,在图像中每个波段包含256个值。可以使用函数,它应该采用单个参数。对每个可能的像素值调用该函数一次,并将结果表应用于图像的所有波段。

换句话说,它不是通过函数映射每个像素的通用方法,它只是一种动态构建查找表的方法,而不是传递预先构建的查找表。

换句话说,它使用0255的数字进行调用。 (通过编写一个将其参数附加到全局列表然后在最后转出列表的函数,您可以很容易地找到自己...)

如果您将图像分割成单独的波段或平面,point每个波段或平面具有不同的功能,然后重新组合它们,这可能会完成您尝试做的事情。但即便如此,我认为eval是你想要的,而不是point

但我认为你真正想要的是什么,这是一个逐像素的全频带一次迭代器。你不需要任何特别的东西。只需使用map或理解getdata即可。那不是很慢吗?当然它很慢,因为它调用你的函数X * Y次;与成本相比,构建getdata序列并迭代它的成本很小,因此寻找PIL优化已经足够快的部分的方法不会让你走得太远。