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

时间:2017-10-30 00:28:05

标签: python image numpy opencv

我有很多图像需要翻转(动态),所以我正在寻找使用Python的最快方法。

最有效的方法是什么?

我在磁盘上有图像文件,并尝试过各种方法,如下面我自己的答案所示,但这些都是从Numpy数组开始的,所以可能不是最佳的。还有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

您可以简单地使用slicing翻转第二个最后一个轴,以获得等效的翻转视图到输入的图像数组中,因此不会在内存中创建任何新数据,因此是一个有效的数据,如此 -

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

答案 1 :(得分:3)

以下是两种方式,使用:

  1. OpenCV cv2.flip()
  2. Numpy np.fliplr()
  3. 导入包

    import cv2
    import numpy as np
    

    我有一个numpy数组中的三个图像,每个图像的分辨率如下所示:

    images.shape
    (3, 200, 400, 3)
    

    使用Jupyter的%%timeit模块:

    %%timeit -r 10 -n 100000
    [cv2.flip(images[i], 1) for i in range(3)]
    
    --> 70.4 µs ± 1.16 µs per loop (mean ± std. dev. of 10 runs, 100000 loops each)
    
    %%timeit -r 10 -n 100000
    [np.fliplr(images[i]) for i in range(3)]
    
    --> 3.19 µs ± 288 ns per loop (mean ± std. dev. of 10 runs, 100000 loops each)
    

    运行以下代码可确保结果完全相同:

    x = [cv2.flip(images[i], 1) for i in range(3)]
    y = [np.fliplr(images[i]) for i in range(3)]
    
    for i in range(3):
        print(np.array_equal(x[i], y[i]))
    
    # True
    # True
    # True
    

    所以numpy是约。比opencv快20倍