Python:沿垂直轴镜像图像的最有效方法

标签 python image numpy opencv

我有很多图像需要(即时)翻转,因此我正在寻找使用 Python 执行此操作的最快方法。

最有效的方法是什么?

我在磁盘上有图像文件并尝试了一些方法,如下面我自己的回答所示,但这些都是从 Numpy 数组开始的,因此可能不是最佳的。有没有更好的方法?

最佳答案

您可以简单地使用切片来翻转倒数第二个轴,以获得输入图像数组中的等效翻转 View ,因为这样不会在内存中创建任何新数据,因此是一种高效的数据, 像这样 -

images[...,::-1,:]

如果您仍然需要制作副本,请在那里使用 .copy,这仍然比 np.fliplr 更有效,并且对于小/体面大小的数组来说很明显。

运行时测试-

看来 NumPy 是赢家,所以我会用它来测试一下。

In [64]: images = np.random.randint(0,255,(3,200,400,3))

In [65]: out1 = np.array([np.fliplr(images[i]) for i in range(3)])

In [66]: out2 = images[...,::-1,:]

In [67]: np.allclose(out1, out2)
Out[67]: True

In [68]: %timeit np.array([np.fliplr(images[i]) for i in range(3)])
1000 loops, best of 3: 1.38 ms per loop

In [69]: %timeit images[...,::-1,:]
1000000 loops, best of 3: 259 ns per loop # virtually free

如果你需要文案-

In [76]: images = np.random.randint(0,255,(3,10,10,3))

In [77]: %timeit np.array([np.fliplr(images[i]) for i in range(3)])
100000 loops, best of 3: 5.76 µs per loop

In [78]: %timeit images[...,::-1,:].copy()
100000 loops, best of 3: 2.23 µs per loop

In [79]: images = np.random.randint(0,255,(3,100,100,3))

In [80]: %timeit np.array([np.fliplr(images[i]) for i in range(3)])
10000 loops, best of 3: 159 µs per loop

In [81]: %timeit images[...,::-1,:].copy()
10000 loops, best of 3: 152 µs per loop

关于Python:沿垂直轴镜像图像的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47006652/

相关文章:

java - 尝试从 android 将图像上传到我的服务器

java选择随机图像

iphone - 自定义 UIButton 图片 iOS

python - 有效地将每一行的元素相乘

python - Pandas :按日期查找重复项目

python - python basemap 中的ValueError?

python - flask - ImportError : No module named app

python - Pandas - 按日期对日内时间序列进行分组

python - 嵌套 'while' 循环 - 如何跳出一个循环,然后跳出另一个循环?

python - 两个表之间的非标准交互以避免非常大的合并