1

我正在处理

  1. myWxImage, 一个图像。
  2. myLabelImage,一个 numpy 数组,具有与图像相同的形状,并且每个像素都包含一个标签(一个整数)
  3. myLookupTable,一维 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. 将权重向量预先计算为一维 numpy 浮点数组(重塑+查找),
  2. 使用 wxImage GetData调用获取 RGB 图像数据
  3. 使用fromstring将其转换为 numpy 数组
  4. 使用 numpy 逐元素乘法得到最终图像
  5. 使用 numpy array.tostring + wxImage.SetData 将其转回图像

直接对图像缓冲区本身进行乘法(使用GetDataBuffer)可能会更快,而不是通过 numpy 数组往返;你得花时间看看。

于 2012-11-05T02:19:14.860 回答