2012-02-08 13 views
2

私は(とりわけ)デルタフィルタをRGB画像に適用する必要があるデコンプレッサを作成しています。すなわち、最初の画素のみが絶対的(R1、G1、B1)であり、他のすべてが絶対値である(R [n] -R [n-1]、G [n] -G [n-1] ]、B [n] -B [n-1])に変換し、標準RGBに変換する。今、次のように私はnumpyの使用していpython/numpyでデルタフィルタを高速化する

  • ライン1は、元画像の1次元配列を作成

    rgb = numpy.fromstring(data, 'uint8') 
    components = rgb.reshape(3, -1, order='F') 
    filtered = numpy.cumsum(components, dtype='uint8', axis=1) 
    frame = numpy.reshape(filtered, -1, order='F') 
    

  • ライン2は

    [[R1, R2, ..., Rn], [G1, G2, ..., Gn], [B1, B2, ..., Bn]] 
    
  • 線3は、実際defilteringを実行線4は、1Dアレイ

問題に再び変換

  • は、それがあることである形でそれを整形します私のニーズには遅すぎる。私はそれをプロファイリングし、配列を再形成するのに十分な時間が費やされることを見出しました。

    私は疑問に思っています。再形成を避けるか、スピードアップする方法はありますか?

    注:

    • 私は、このためのC拡張を記述する必要がないことを好むだろう。
    • 私はすでに、私はまだ理解していなかったいくつかの理由で、あなたのコードをコピーしたデータの最後のリシェイプのためにマルチスレッド
  • +0

    をあなたの 'rgb'データは0から255の範囲にある場合は、' numpy.cumsum'は黙ってオーバーフローすることを良いチャンスがあります。 'x = np.arange(255、dtype = 'uint8')'と 'y = np.cumsum(x、dtype = 'uint8')'のときに何が起こるかを見てみましょう。 – unutbu

    +0

    さて、私はそれがオーバーフローするか、別の言い方をすると、それはmod 255を作動させていると思う。 – Alberto

    +0

    それは意図的だった。しかし、 'R [n] -R [n-1]'などを計算するために、 'filtered = numpy.diff(components、axis = 1)'ではないでしょうか? – unutbu

    答えて

    1

    まず、あなたがタイプについてはもう少しそれを伝えることができ、それを読んだときに、試してみてください。

    rgb = numpy.fromstring(data, '3uint8') 
    

    ませリシェイプ必要。

    次に、大規模な操作の場合は、その場所から離れて(cumsumの資格がある)、out=パラメータを使用してデータを移動しないようにしてください。あなたはまだそれがフラット化したい場合

    rgb.cumsum(axis=0,out=rgb) 
    

    :使用

    rgb = rgb.ravel() 
    
    +0

    これは約15%向上しました。私は3つのコアで十分です(私の目標です)。 – Alberto

    +0

    他のいくつかの実験の後、私はこのレイアウトでそれを平坦化する必要はないことを発見しました。 rgb.ravel()を削除すると別の+ 5%! – Alberto

    2

    を使用しています。これは代わりに、FortranのためのCの順序を使用することによって回避することはできない。

    rgb = numpy.fromstring(data, 'uint8') 
    components = rgb.reshape(-1, 3) 
    filtered = numpy.cumsum(components, dtype='uint8', axis=0) 
    frame = filtered.reshape(-1) 
    
    +0

    最終的な形がデータをコピーする環境をどのように表示できますか?私はこの結果を 'rgb = np.fromstring( '\ x01 \ x02 \ x03' * 2、dtype = np.uint8)'で始まり、 'frame.flags ['OWNDATA']' 。 – unutbu

    +0

    チップのおかげで、速度が約12%向上しました。 – Alberto

    +0

    @unutbu:「owndata」フラグを見るだけでは、コピーが間にどこかで作成されたかどうかを確かめる方法ではないことがわかりました。私は 'frame [:] = 0'を行い、' filtered'もゼロ化されているかどうかをチェックしましたが、そうではありませんでした。 –