我正在尝试以某种方式编辑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值?如果是这样,怎么办?

最佳答案

听起来您正在使用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):

为了得到这样的东西

仍然有一些光晕/边界文物,但更好。

对于您的情况,对于简单的黑白图像,您可能只想根据像素的白色来设置Alpha(我经常在photoshop中这样做)。您可以使用3个颜色 channel 之一,甚至可以使用平均值。就像是:
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。

无论如何,对于一个简单的问题来说,答案很长,但希望能有所帮助。

10-05 21:00
查看更多