我似乎无法理解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文件中理解
答案 0 :(得分:0)
在早期版本的PIL中,文档可能并不清楚,但在Pillow中,它的拼写非常清楚。来自Image.point
:
lut - 一个查找表,在图像中每个波段包含256个值。可以使用函数,它应该采用单个参数。对每个可能的像素值调用该函数一次,并将结果表应用于图像的所有波段。
换句话说,它不是通过函数映射每个像素的通用方法,它只是一种动态构建查找表的方法,而不是传递预先构建的查找表。
换句话说,它使用0
到255
的数字进行调用。 (通过编写一个将其参数附加到全局列表然后在最后转出列表的函数,您可以很容易地找到自己...)
如果您将图像分割成单独的波段或平面,point
每个波段或平面具有不同的功能,然后重新组合它们,这可能会完成您尝试做的事情。但即便如此,我认为eval
是你想要的,而不是point
。
但我认为你真正想要的是什么,这是一个逐像素的全频带一次迭代器。你不需要任何特别的东西。只需使用map
或理解getdata
即可。那不是很慢吗?当然它很慢,因为它调用你的函数X * Y次;与成本相比,构建getdata
序列并迭代它的成本很小,因此寻找PIL优化已经足够快的部分的方法不会让你走得太远。