如何在Python中设置像素的Alpha值

6
我想编辑一个image,将所有白色像素转换为透明像素(alpha值为0)。基本上我想要去掉背景。
我知道图片文件的im.putpixel方法,但是从我的实验中发现这不允许我设置alpha值。我尝试了以下方法:
for x in range(90):
    for y in range(80, 90):
        im.putpixel((x, y), (0, 0, 0, 0))

我只是在指定区域得到黑色,而不是透明。有办法改变像素的alpha值吗?如果有,怎么做?

2个回答

14

看起来你正在使用Python图像库 (PIL)。

如果是这样,你可以像这样操作:

from PIL import Image
image = Image.open("<path to image file>").convert('RGBA')
pixeldata = list(image.getdata())

for i,pixel in enumerate(pixeldata):
    if pixel[:3] == (255,255,255):
        pixeldata[i] = (255,255,255,0)

image.putdata(pixeldata)
image.save("output.png")

这应该会生成类似这样的内容:

输入图像描述输入图像描述

当然,那可能不完全是你想要的。你可以在颜色接近白色而不是完全白色时将像素设置为透明。你可以定义一个类似于下面的函数:

def almostEquals(a,b,thres=5):
    return all(abs(a[i]-b[i])<thres for i in range(len(a)))

请将检查颜色的代码行替换为:

if almostEquals(pixel[:3], (255,255,255):

为了获得类似这样的效果:

enter image description hereenter image description here

仍然存在一些光晕/边框伪影,但已经更好了。
在您的情况下,对于一个简单的黑白图像,您可能只想基于像素有多白来设置alpha通道(我经常在Photoshop中这样做)。你可以使用三个颜色通道中的一个或者平均值。像这样:
for i,pixel in enumerate(pixeldata):
    avg = int(sum(pixel[:3])/3.0)
    pixeldata[i] = (pixel[0],pixel[1],pixel[2],255-avg)

这样会给你一个类似这样的结果:

输入图像描述输入图像描述

虽然还有一点光晕,因为我们仍然只是改变 alpha 值,但已经好多了。为了修复甚至可能做一些像将所有像素都设为黑色而不仅仅是修改 alpha 的事情。

无论如何,这是对一个简单问题的长回答,希望能有所帮助。


0

试试这个:

for x in range(90):
    for y in range(80, 90):
        pixels[x, y] = (0, 0, 0, 0)

这让我得到了一张完全黑色的图像 - 但我不知道这是否只是im.show()的工作方式。将其设置为pixels[x, y] = (255, 255, 255, 0)使其变为白色,我可以肯定它不是透明的。 - mishaturnbull
为了透明度,你要更改的是不透明度而不是颜色。 - safaiyeh
正确。我应该怎么做呢?有没有im的方法可以设置图片的透明度? - mishaturnbull
Python本身没有处理不透明度的功能。但是,有许多外部库可以实现此功能。 - safaiyeh
好的,我会看一下。谢谢! - mishaturnbull

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接