【发布时间】:2010-08-26 18:39:42
【问题描述】:
我有一个应用程序,它从使用 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 位图格式。所以我需要从 data->wx.Image->numpy array->wx.Image.
我还考虑过实现我自己的 python 缓冲区,例如,它会在读取时返回 G 像素值而不是 R 和 B 值。我认为这将是理想的解决方案,因为它不需要数据复制或过多的迭代,但我不知道如何去做。我需要用 C 语言编写这个缓冲区吗?是否可以在纯 python 中实现缓冲区并仍然操作原始内存?
那么,您认为我应该如何提高我的表现?我应该尝试 numpy 或 buffer 解决方案,还是我缺少更简单的解决方案?
我主要是在寻找相关文档或示例的想法/链接,但如果有人想编写一些代码,那很好:)
谢谢
【问题讨论】:
标签: python image-processing bitmap wxwidgets ctypes