【问题标题】:Image bit manipulation in PythonPython中的图像位操作
【发布时间】: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


    【解决方案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 语言实现的,并且针对图像处理进行了优化。

    【讨论】:

      【解决方案2】:

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

      祝你好运!

      【讨论】:

        猜你喜欢
        • 2014-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-23
        • 2020-07-06
        • 1970-01-01
        相关资源
        最近更新 更多