Python和wx图像:如何快速对每个像素应用一个简单的函数?

2024-06-26 14:01:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理

  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

Tags: in图像numpyforrgb像素标签数组
1条回答
网友
1楼 · 发布于 2024-06-26 14:01:42

如果标签图像和查找表是常量,可以尝试以下操作:

  1. 将权重向量预计算为1D numpy float数组(整形+查找)
  2. 使用wxImageGetData调用获取RGB图像数据
  3. 使用fromstring将其转换为numpy数组
  4. 使用numpy元素乘除得到最终图像
  5. 使用numpy将其还原为图像数组.tostring+ wxImage.SetData在

直接对图像缓冲区本身执行乘法(使用GetDataBuffer)可能会更快,而不是通过numpy数组往返;您必须计时并查看。在

相关问题 更多 >