2

私は(とりわけ)RGB画像にデルタフィルターを適用しなければならないデコンプレッサーを書いています。つまり、最初のピクセルのみが絶対(R1、G1、B1)で、他のすべてのピクセルが(R [n] -R [n-1]、G [n] -G [n-1)の形式である画像を読み取ります。 ]、B [n] -B [n-1])、それらを標準RGBに変換します。

現在、私は次のようにnumpyを使用しています。

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')

どこ

  • 1行目は、元の画像の1D配列を作成します。
  • 2行目はそれを形に変えます

    [[R1, R2, ..., Rn], [G1, G2, ..., Gn], [B1, B2, ..., Bn]]
    
  • 3行目は実際のデフィルタリングを実行します

  • 4行目は再び1D配列に変換されます

問題は、それが私のニーズには遅すぎるということです。プロファイルを作成したところ、アレイの再形成にかなりの時間が費やされていることがわかりました。

だから私は疑問に思います:形を変えるのを避けるか、それをスピードアップする方法はありますか?

ノート:

  • このためにC拡張機能を作成する必要はありません。
  • 私はすでにマルチスレッドを使用しています
4

2 に答える 2

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)
于 2012-02-08T19:55:32.993 に答える
1

まず、それを読むと、タイプについてもう少し詳しく知ることができます。試してみてください。

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

形を変える必要はありません。

次に、それを回避できる(そしてcumsum修飾できる)大規模な操作の場合は、out=paramを使用してデータが移動しないようにします...すべてが適切に行われます。使用する:

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

それでもフラットにしたい場合:

rgb = rgb.ravel()
于 2012-02-08T20:19:18.633 に答える