0

我似乎无法理解 Image point 的作用。我想做一些像素编辑,其中可能包括检查每个像素中哪个颜色值(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()

代码

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。这是什么我?是像素吗?(即 i=(r,g,b)?)。我似乎无法从 pil 文档中理解

4

1 回答 1

0

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

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

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

换句话说,它是用从0through的数字调用的255。(您只需编写一个函数,将其参数附加到全局列表,然后在最后转储列表,您就可以很容易地发现这一点……)

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

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

于 2013-11-02T00:07:44.943 回答