Python中的图像位操作

3
我有一个应用程序,从使用ctypes包装的相机API接收指向JPEG数据的指针,将其转换为wx.Image,并将图像显示为电影。
其中一个必需的功能是将像素的两个分量设置为第三个分量。例如,我的RGB格式像素为(100,200,255),我想将R和B值设置为G,即(200,200,200)。我需要在保持良好帧率的同时对图像中的每个像素执行此操作。
我可以通过调用Image.GetData从我的wx.Image访问RGB值,该方法返回一个字符串,其中包含以下格式的像素值:RGBRGBRGB...我通过迭代这个RGBRGBRGB字符串来实现该特性。
然而,这种天真的方法速度太慢,无法达到良好的FPS,因为(我认为):
a)我正在遍历图像中的每个像素。
b)我正在做过多的数据复制。
我考虑将我的RGB数据转换为numpy,执行操作(我假设numpy有一种更快的方法来做这种事情),然后再转换回wx.Image。不幸的是,我不能直接从原始数据转换为numpy,因为数据以JPEG格式而不是RGB位图的形式提供。因此,我需要从数据->wx.Image->numpy数组->wx.Image。
我还考虑实现自己的Python缓冲区,当读取时返回G像素值而不是R和B值。我认为这将是理想的解决方案,因为它不需要数据复制或过多的迭代,但我不知道如何去做。我需要用C编写此缓冲区吗?是否可以在纯Python中实现缓冲区并仍然操作原始内存?
那么,SO,您认为我应该如何改进我的性能?我应该尝试numpy或缓冲区解决方案,还是我忽略了更简单的解决方案?
我主要寻找相关文档或示例的想法/链接,但如果有人想编写一些代码,那也可以:)
谢谢
2个回答

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 图像。

这应该比在 Python 中执行要快几个数量级,因为 PIL 是用 C 实现并针对图像处理进行优化的。


1
如果您需要快速处理图像,我建议编写GLSL像素着色器并通过OpenGL和PyGame进行接口。 没有什么比像素着色器的处理速度更快了,因为每个像素都由视频卡上的GPU并行处理。 如果您需要测试使用C子集编写的像素着色器代码,则最好使用RenderMonkey - 这是一个不错的着色器开发IDE! 祝你好运!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接