Python和wx.Image:如何将一个简单的函数应用于每个像素FAST?

时间:2012-11-05 02:01:36

标签: python image loops wxwidgets

我正在处理

  1. myWxImage,一张图片。
  2. myLabelImage,一个与图像形状相同的numpy数组,每个像素包含一个标签(整数)
  3. myLookupTable,一维numpy数组,即一个向量,其条目与标签一样多。 (我用它来将标签映射到浮点数。)
  4. 目标是迭代像素,并且对于每个像素,考虑其标签,查找相应的浮点数并将其与该像素的颜色相乘。

    以下代码正是如此,但太慢。你有一个简单的建议如何更快地做到这一点,而不采用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
    

1 个答案:

答案 0 :(得分:1)

如果标签图像和查找表是不变的,您可以尝试以下方法:

  1. 将权重向量预先计算为1D numpy float数组(重新整形+查找),
  2. 使用wxImage GetData调用来获取RGB图像数据
  3. 使用fromstring
  4. 将其变为numpy数组
  5. 使用numpy逐元素乘法来获得最终图像
  6. 使用numpy array.tostring + wxImage.SetData
  7. 将其变回图像

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