Python - 使用PIL的灰度公式

时间:2015-09-02 19:51:29

标签: python image python-imaging-library

我想通过自己的代码制作灰度图像。

from PIL import Image

path = "people.jpg"

img = Image.open(path)
img = img.convert("LA")
img.save("new_image.png")

所以我为自己的公式更改了img.convert()。但它不起作用。

from PIL import Image

path = "people.jpg"

img = Image.open(path)
rgb = img.convert("RGB")
width,height = rgb.size

for x in range(width):
    for y in range(height):
        red,green,blue = rgb.getpixel((x,y))
        value = red * 299/1000 + green * 587/1000 + blue * 114/1000
        value = int(value)
        rgb.putpixel((x,y),value)


rgb.save("new.png")

知道出了什么问题吗?新图像带有红色背景。

2 个答案:

答案 0 :(得分:3)

martineau所述,rgb被初始化为RGB(三频段)图像,因此它需要RGB值。你想要灰度,只需要一个乐队。你有两个选择:

  1. 关注martineau的建议,只需将rgb.putpixel((x,y),value)替换为rgb.putpixel((x, y), (value, value, value))。这将为其提供正确的三种颜色值。
  2. 在将像素放入其中之前,使用Image.new('L',...)创建新的灰度图像。
  3. 以下是如何实施选项2(请注意我使用的是Python 2.7):

    from PIL import Image
    
    path = "people.jpg"
    
    img = Image.open(path)
    width, height = rgb.size
    gray = Image.new('L', (width, height))
    
    for x in xrange(width):
        for y in xrange(height):
            r, g, b = img.getpixel((x, y))
            value = r * 299.0/1000 + g * 587.0/1000 + b * 114.0/1000
            value = int(value)
            gray.putpixel((x, y), value)
    
    gray.save("new.png")
    

    此外,如果需要考虑速度,请考虑使用putdata()代替putpixel()。 (那不是重点,所以我不胜任它。)

答案 1 :(得分:0)

灰度图像将为每个像素提供两个值的元组 - (亮度值,255)。创建一个新的灰度图像并为每个像素放置值都可以。

greyim=Image.new("LA",(width,height))

for x in range(width):
    for y in range(height):
        red,green,blue = rgb.getpixel((x,y))
        value = red * 299/1000 + green * 587/1000 + blue * 114/1000
        greyim.putpixel((x,y),(value,255))