1

我有一个 RGB 图像,并试图将我的 RGB 上的每个像素设置为黑色,其中相应的 alpha 像素也为黑色。所以基本上我正在尝试将 alpha“烘焙”到我的 RGB 中。我已经尝试过使用 PIL 像素访问对象、PIL ImageMath.eval 和 numpy 数组:

PIL 像素访问对象:

def alphaCutoutPerPixel(im):
    像素 = im.load()
    对于范围内的 x(im.size[0]):
        对于范围内的 y(im.size[1]):
            px = 像素[x, y]
            r,g,b,a = 像素
            if px[3] == 0: # 如果 alpha 为黑色...
                像素[x,y] = (0,0,0,0)
    返回我

PIL ImageMath.eval:

def alphaCutoutPerBand(im):
    新乐队 = []
    r, g, b, a = im.split()
    对于 (r, g, b) 中的波段:
        out = ImageMath.eval("convert(min(band, alpha), 'L')", band=band, alpha=a)
        newBands.append(out)
    newImg = Image.merge("RGB", newBands)
    返回新图片

numpy 数组:

def alphaCutoutNumpy(im):
    数据 = numpy.array(im)
    r, g, b, a = 数据.T
    blackAlphaAreas = (a == 0)
    # 这失败了;为什么?
    数据[..., :-1][blackAlphaAreas] = (0, 255, 0)
    返回 Image.fromarray(数据)

第一种方法效果很好,但速度很慢。第二种方法适用于单个图像,但在要求转换多个图像时会在第一种方法之后停止。我基于此示例创建的第三种方法(第一个答案):Python:PIL replace a single RGBA color 但在标记命令处失败:

data[..., :-1][blackAlphaAreas] = (0, 255, 0, 0)
IndexError: index (295) out of range (0<=index<294) in dimension 0

Numpy 似乎对这类东西很有希望,但我并没有真正了解如何一步设置数组部分的语法。有什么帮助吗?也许其他想法可以快速实现我上面描述的内容?

干杯

4

1 回答 1

2

这不使用高级索引,但更容易阅读,恕我直言:

def alphaCutoutNumpy(im):
    data = numpy.array(im)
    data_T = data.T
    r, g, b, a = data_T
    blackAlphaAreas = (a == 0)
    data_T[0][blackAlphaAreas] = 0
    data_T[1][blackAlphaAreas] = 0
    data_T[2][blackAlphaAreas] = 0
    #data_T[3][blackAlphaAreas] = 255
    return Image.fromarray(data[:,:,:3])
于 2013-07-12T13:34:52.097 回答