python - Python 中的图像位操作

标签 python image-processing bitmap wxwidgets ctypes

我有一个应用程序从用 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 或缓冲解决方案,还是我缺少更简单的解决方案?

我主要是在寻找相关文档或示例的想法/链接,但如果有人想编写一些代码,那很好:)

谢谢

最佳答案

您可以尝试使用 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 语言实现的,并且针对图像处理进行了优化。

关于python - Python 中的图像位操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3578373/

相关文章:

python - 查找图中的所有闭环

python - 冗余函数调用会发生什么?

python - 在我的 Mac 上安装 pycrypto 时出错

java - Java 和 opencv 3.0 中的 OpenCV 错误 : Assertion failed (! empty()) 是什么意思?

java - 使用 Java 或 Javascript 对社交网站进行图像处理

android - 将android资源位图批量转换为不同密度的工具

python - 一种更简洁的方法来尝试 try except in python

python - 使用python在单色图像中围绕 Blob 的矩形​​边界框

Android 颜色格式(RGB565、ARGB8888)

bitmap - 如何从 Redis 中的位图中获取所有值?