如何在 Python 中设置像素的 alpha 值
How to set alpha value of a pixel in Python
我正在尝试以某种方式编辑 image,以便将所有白色像素转换为透明像素(具有 0 alpha 值)。基本上我想摆脱背景。
我知道图像文件的 im.putpixel
方法,但根据我的实验,这不允许我设置 alpha 值。我尝试了以下方法:
for x in range(90):
for y in range(80, 90):
im.putpixel((x, y), (0, 0, 0, 0))
并且只是在指定区域变黑,而不是透明。有没有办法改变像素的 alpha 值?如果可以,怎么做?
试试这个:
for x in range(90):
for y in range(80, 90):
pixels[x, y] = (0, 0, 0, 0)
听起来您正在使用 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):
得到这样的东西
仍有一些 haloing/border 人工制品,但更好。
在您的情况下,对于简单的黑白图像,您可能只想根据像素的白度设置 alpha(我经常在 photoshop 中这样做)。您可以使用 3 个颜色通道之一,甚至可以使用平均值。类似于:
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。
无论如何,一个简单问题的长答案,但希望能有所帮助。
我正在尝试以某种方式编辑 image,以便将所有白色像素转换为透明像素(具有 0 alpha 值)。基本上我想摆脱背景。
我知道图像文件的 im.putpixel
方法,但根据我的实验,这不允许我设置 alpha 值。我尝试了以下方法:
for x in range(90):
for y in range(80, 90):
im.putpixel((x, y), (0, 0, 0, 0))
并且只是在指定区域变黑,而不是透明。有没有办法改变像素的 alpha 值?如果可以,怎么做?
试试这个:
for x in range(90):
for y in range(80, 90):
pixels[x, y] = (0, 0, 0, 0)
听起来您正在使用 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):
得到这样的东西
仍有一些 haloing/border 人工制品,但更好。
在您的情况下,对于简单的黑白图像,您可能只想根据像素的白度设置 alpha(我经常在 photoshop 中这样做)。您可以使用 3 个颜色通道之一,甚至可以使用平均值。类似于:
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。
无论如何,一个简单问题的长答案,但希望能有所帮助。