Python - 带 PIL 的灰度公式

标签 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")

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

最佳答案

作为martineau提到,rgb 被初始化为 RGB(三波段)图像,因此它需要 RGB 值。你想要灰度,它只需要一个波段。您在这里有两个选择:

  1. 听从 martineau 的建议,简单地将 rgb.putpixel((x,y),value) 换成 rgb.putpixel((x, y), (value, value, value) )。这将为它提供适当的三种颜色值。
  2. 在将像素放入其中之前,使用 Image.new('L',...) 创建一个新的灰度图像。

下面是您可能如何实现选项 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()。 (这是题外话,我就不赘述了。)

关于Python - 带 PIL 的灰度公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32361908/

相关文章:

python - 在 python 中搜索嵌套列表的最有效方法是什么?

python - 如何删除或替换两个 xml 标记之间的特定字符 [linux、python、lxml、sed、awk、...]?

python - 奇怪的 lxml 行为

python - aiohttp 显示错误 403 禁止

c# - 使用 C# 保存 jpeg 图像

Android Webview shouldOverrideUrlLoading() 不为 base64 图像数据 URL 调用

html - 如何在html中正确显示纵向模式的图像?

python - 使用 Python PIL 捕获 x,y 坐标

python-3.x - 如何使用 PIL 或类似的东西用 yuv420 格式数据写入图像

python - 将 RGB 三元组列表排序为光谱