繁体   English   中英

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

[英]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个值。 可以改用函数,它应使用单个参数。 对每个可能的像素值调用一次该函数,并将结果表应用于图像的所有波段。

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

换句话说,它被称为从0255的数字。 (您可以通过编写一个将其参数附加到全局列表,然后在末尾转储该列表的函数轻松地找到自己的位置……)

如果将图像分成单独的带或平面,则将每个带或平面point不同的功能,然后重新组合它们,这也许可以完成您要尝试的操作。 但是即使那样,我仍然认为eval是您想要的,而不是point

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM