1

私は扱っています

  1. myWxImage、 画像。
  2. myLabelImage、画像と同じ形状で、ピクセルごとに1つのラベル(整数)を含むnumpy配列
  3. myLookupTable、ラベルと同じ数のエントリを持つ1次元のnumpy配列、つまりベクトル。(ラベルを浮動小数点数にマップするために使用します。)

目標は、ピクセルを反復処理し、すべてのピクセルについて、そのラベルを検討し、対応する浮動小数点数を調べて、このピクセルの色で乗算することです。

次のコードはこれを正確に実行しますが、遅すぎます。もちろん、ここで非常に理にかなっているC ++またはGPUプログラミングに頼らずに、これをより速く行う方法についての簡単な提案がありますか?

weightedImage = wx.EmptyImage(myWxImage.Width, myWxImage.Height)
rgb = numpy.zeros(3, dtype=int);
for x in range(0, myWxImage.Width):
    for y in range(0, myWxImage.Height):
        label = myLabelImage[x, y]
        weight = myLookUpTable[label]
        rgb[0] = myWxImage.GetRed(x, y)
        rgb[1] = myWxImage.GetGreen(x, y)
        rgb[2] = myWxImage.GetBlue(x, y)
        rgb = rgb * weight
        weightedImage.SetRGB(x, y, rgb[0], rgb[1], rgb[2])
myBitmap = wx.BitmapFromImage(weightedImage)

# draw myBitmap
4

1 に答える 1

1

ラベル イメージとルックアップ テーブルが一定である場合は、次の方法を試すことができます。

  1. 重みベクトルを 1D numpy float 配列として事前計算 (reshape+lookup)、
  2. wxImage GetData呼び出しを使用して、RGB 画像データを取得します
  3. fromstringを使用してnumpy配列に変換します
  4. numpy 要素ごとの乗算を使用して、最終的な画像を取得します
  5. numpy array.tostring + wxImage.SetData を使用して画像に戻します

numpy 配列をラウンドトリップするのではなく、 ( GetDataBufferを使用して) 画像バッファー自体で直接乗算を行う方が速い場合があります。時間をかけて見る必要があります。

于 2012-11-05T02:19:14.860 に答える