2012-04-21 16 views

答えて

4

はSurfarrayを使用し、numpyのか数値でそれをフィルタリング:

def grayscale(self, img): 
    arr = pygame.surfarray.array3d(img) 
    #luminosity filter 
    avgs = [[(r*0.298 + g*0.587 + b*0.114) for (r,g,b) in col] for col in arr] 
    arr = numpy.array([[[avg,avg,avg] for avg in col] for col in avgs]) 
    return pygame.surfarray.make_surface(arr) 
+0

あなたの代わりに.array3dの.pixels3d使用している場合は、新しい表面にすべてのデータをコピー避けることができます。 – imallett

+0

同じロジックを使用してこれを高速化するには、 'arr = arr.dot([0.298、0.587、0.114])[:、:、None] .repeat(3、axis = 2); return pygame.surfarrary.make_surface(arr) '。私の(800x600)テスト画像では、これは2桁以上のスピードでスピードアップします。 – Jason

2

最も簡単な方法は、画像のすべてのピクセルを繰り返し、.get_at(...)および.set_at(...)を呼び出すことです。

これはかなり遅いので、NumPyの使用に関する暗黙の示唆に答えて、http://www.pygame.org/docs/tut/surfarray/SurfarrayIntro.htmlをご覧ください。概念とコードの大部分は同一です。

関連する問題