2010-08-26 30 views
3

我有一个应用程序,它接收来自包装有ctypes的相机API的JPEG数据指针,将其转换为wx.Image,并将图像显示为电影。Python中的图像位操作

其中一个需要的功能是设置一个像素的两个分量等于第三个。例如,RGB格式的像素是(100,200,255),我想将R和B值设置为等于G或(200,200,200)。我需要为图像中的每个像素做他 ,同时保持一个体面的帧率。

我可以通过调用Image.GetData来访问我的wx.Image中的RGB值,它将以下列格式返回一个包含像素值的字符串:RGBRGBRGB ...我通过遍历该RGBRGBRGB串。

然而,这种幼稚的做法实在太慢,实现体面的FPS,因为(我认为):

一)我通过图像中的每个像素迭代。

b)我正在做太多的数据复制。

我已经考虑将RGB数据转换为numpy,执行操作(我假设numpy会有更快的方式做这种事情),然后转换回wx.Image。不幸的是,我不能直接从原始数据转换为numpy,因为数据以JPEG形式出现,而不是以RGB位图形式出现。所以我需要从data-> wx.Image-> numpy array-> wx.Image。

我还考虑实现我自己的python缓冲区,它将在读取时返回例如G像素值而不是R和B值。我认为这将是理想的解决方案,因为它不需要数据复制或迭代过多,但我不知道如何去做这件事。我需要用C写这个缓冲区吗?是否有可能在纯Python中实现缓冲区并仍然处理原始内存?

所以,你认为我应该改善我的表现吗?我应该尝试numpy还是缓冲解决方案,还是有更简单的解决方案,我错过了?

我主要寻找创意/链接到相关的文档或实例,但是,如果某人想要写一些代码,然后这很好:)

感谢

回答

1

你可以尝试使用Python Imaging Library(PIL) - 这是一个操作图像的库。

您可以在wxPython图像和PIL图像here之间找到有关转换的信息,或者您可以直接将jpeg加载到PIL图像中。

一旦你已经将您的WX图像转化为PIL图像我认为这会做你想做的(但我没有测试过):

r, g, b = im.split()    # split the image into separate color planes 
im = Image.merge("RGB", (g, g, g)) # merge them back, using the green plane for each 

然后将其转换回一个wxPython的图像。

由于PIL是在C中实现的,并且为图像处理进行了优化,所以这应该比在Python中执行要快几个数量级。

1

如果您需要真正快速的图像处理,我建议您编写GLSL pixel shader并通过OpenGL和PyGame进行连接。 没有什么比像素着色器的处理速度快,因为每个像素都由视频卡上的GPU并行处理。 如果您需要测试像素着色器代码(用C的子集编写),最好使用RenderMonkey这样做 - 它是体面着色器开发IDE!

祝你好运!