[英]Pixel to pixel edit using PIL and Image.point
我似乎无法理解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()
numpy代码
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的要快。 但是,如果我想对point执行更复杂的操作该怎么办。 例如,对于每个像素,检查max(r,g,b)并根据r = max或g = max或b = max进行操作。 如您所见,我将功能点用作参数。 我需要一个论点。 我这是什么? 是像素吗?(即i =(r,g,b)?)。我似乎无法从pil文档中了解
在早期版本的PIL中,文档可能还不清楚,但是在Pillow中,说明得很好。 从Image.point
:
lut –查找表,在图像中每个波段包含256个值。 可以改用函数,它应使用单个参数。 对每个可能的像素值调用一次该函数,并将结果表应用于图像的所有波段。
换句话说,这不是通过函数映射每个像素的通用方法,它只是动态构建查找表的一种方法,而不是传入预构建的表。
换句话说,它被称为从0
到255
的数字。 (您可以通过编写一个将其参数附加到全局列表,然后在末尾转储该列表的函数轻松地找到自己的位置……)
如果将图像分成单独的带或平面,则将每个带或平面point
不同的功能,然后重新组合它们,这也许可以完成您要尝试的操作。 但是即使那样,我仍然认为eval
是您想要的,而不是point
。
但是我认为您真正想要的是一个逐像素的全波段一次迭代器。 而且您不需要任何特殊的东西。 只需使用map
或对getdata
的理解getdata
。 那不是很慢吗? 当然,它很慢,因为它会X * Y次调用您的函数。 与该成本相比,构建getdata
序列并对其进行迭代的成本很小,因此,寻找一种PIL优化已经足够快的部分的方法不会使您走得太远。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.