python - 有没有办法让这个 numpy 操作更快?

标签 python image-processing numpy

我正在尝试从 API 复制原始图像数据。数据是可迭代的或可以使用切片 ([:])。图像数据约为 2000 x 2000 像素。它是一个灰度 float 组,以一维形式存储。这是我现在使用的:

imageData = np.fromiter(rawImageData, dtype=np.float32, count=width*height)

将数据复制到 numpy 数组大约需要 2-3 秒。有没有更快的方法来复制/调整数据?

其他信息:我之前尝试过使用np.asarray。它使其速度更快,但与线程存在冲突,如果在单独的线程中执行操作时尝试在主线程中执行任何操作,则程序将崩溃。

最佳答案

我正在测试使用 Pillow 打开的 7200 x 4800 的 .bmp 图像。

In [26]: %timeit np.array(im)
1 loops, best of 3: 222 ms per loop

In [27]: %timeit np.asarray(im)
10 loops, best of 3: 156 ms per loop

转换为 float32 涉及到复制,这需要一些时间,但可以节省内存:

In [39]: %timeit np.array(im, dtype=np.float32)
1 loops, best of 3: 444 ms per loop

In [40]: %timeit np.asarray(im, dtype=np.float32)
1 loops, best of 3: 543 ms per loop

fromiter 需要一个一维数组,所以我们只获取 R channel (我的图像是彩色的):

In [49]: %timeit np.fromiter(im.getdata(0), dtype=np.float32, count=7200*4800)
1 loops, best of 3: 2.49 s per loop

哎呀,还有 2-3 秒的时间。原因是迭代器对于 numpy 来说是一个非常不透明的东西,它喜欢非常结构化的东西。因此,它必须即时推断正在发生的事情,而且效率低得多。因此,使用前两个函数之一,看看它们是否有效。

关于python - 有没有办法让这个 numpy 操作更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25149698/

相关文章:

python - 如何根据另一列的值在 Pandas 数据框列中创建新值

python - 如何通过在 Python 3 中作为命令行参数提供的转义序列拆分 UTF-8 字符串?

python - SQLAlchemy 递归

python - 在多对多字段中使用自引用时,Django related_name 不起作用

image - 检测图像中的乐高底板

image-processing - 图像识别(形状识别)

python - numpy masked_array 掩码更改类型

python - 如何使用 Numpy 重复这个二维对数组?

python - ValueError:长度不匹配:预期轴有13个元素,新值有2个元素

Python PIL.Image.convert 不使用最接近的调色板替换颜色。