1

RGB 画像があり、対応するアルファ ピクセルも黒である RGB のすべてのピクセルを黒に設定しようとしています。基本的に、アルファを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 = px
            if px[3] == 0: # アルファが黒の場合...
                ピクセル[x,y] = (0,0,0,0)
    戻る

PIL ImageMath.eval:

def alphaCutoutPerBand(im):
    newBands = []
    r、g、b、a = im.split()
    (r、g、b) のバンドの場合:
        out = ImageMath.eval("convert(min(バンド, アルファ), 'L')", バンド=バンド, アルファ=a)
        newBands.append(アウト)
    newImg = Image.merge("RGB", newBands)
    新しい画像を返す

でこぼこの配列:

def alphaCutoutNumpy(im):
    データ = numpy.array(im)
    r、g、b、a = data.T
    blackAlphaAreas = (a == 0)
    # これは失敗します。なぜ?
    データ [..., :-1][blackAlphaAreas] = (0, 255, 0)
    Image.fromarray(データ) を返す

最初の方法は問題なく動作しますが、非常に遅いです。2 番目の方法は、1 つの画像に対しては問題なく機能しますが、複数の画像を変換するように求められると、最初の方法の後で停止します。この例に基づいて作成した 3 番目の方法 (最初の回答): 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 はこの種のものに有望なようですが、配列の一部を 1 ステップで設定する方法についての構文は実際にはわかりません。何か助けはありますか?私が上で説明したことをすぐに達成するための他のアイデアはありますか?

乾杯

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 に答える