2

クロマ キー (グリーン スクリーン) のスクリプトを作成し、Python と PIL (枕) を使用していくつかのビデオを合成しています。720p の画像にキーを設定することはできますが、緑色のスピルが残っています。理解できますが、その流出を取り除くためのルーチンを書いています...しかし、時間がかかることに苦労しています. numpy トリックを使用すると、おそらく速度を上げることができますが、あまり詳しくありません。何か案は?

これが私のデスピルルーチンです。PIL 画像と感度番号が必要ですが、これまでのところ 1 のままにしてあります...うまく機能しています。このスピルを取り除くために、720p フレームの 4 秒強で入ってきます。比較のために、クロマ キー ルーチンはフレームあたり約 2 秒で実行されます。

def despill(img, sensitivity=1):
    """
    Blue limits green.
    """
    start = time.time()
    print '\t[*] Starting despill'
    width, height = img.size
    num_channels = len(img.getbands())
    out = Image.new("RGBA", img.size, color=0)
    for j in range(height):
        for i in range(width):
            #r,g,b,a = data[j,i]
            r,g,b,a = img.getpixel((i,j))
            if g > (b*sensitivity):
                out_g = (b*sensitivity)
            else:
                out_g = g
            # end if

            out.putpixel((i,j), (r,out_g,b,a))
        # end for
    # end for
    out.show()
    print '\t[+] done.'
    print '\t[!] Took: %0.1f seconds' % (time.time()-start)
    exit()
    return out
# end despill

putpixel の代わりに、出力ピクセル値を numpy 配列に書き込んでから、その配列を PIL 画像に変換しようとしましたが、平均は 5 秒強でした...これはどういうわけか高速でした。putpixel が最もスマートなオプションではないことは知っていますが、途方に暮れています...

4

1 に答える 1

7

putpixelは遅く、そのようなループはさらに遅くなります。なぜなら、それらは地獄のように遅い Python インタープリターによって実行されるからです。通常の解決策は、画像をすぐに numpy 配列に変換し、高度に最適化された C コードで実行されるベクトル化された操作で問題を解決することです。あなたの場合、私は次のようなことをします:

arr = np.array(img)
g = arr[:,:,1]
bs = arr[:,:,2]*sensitivity
cond = g>bs
arr[:,:,1] = cond*bs + (~cond)*g
out = Image.fromarray(arr)

(それは正しくないかもしれませんし、もっとうまく最適化できると確信しています。これは単なるスケッチです)

于 2015-10-16T23:56:46.460 に答える