如果您仅限于使用 numpy,那么 TheodrosZelleke 的答案就是要走的路。但是如果你允许其他模块,cv2
它是一个与图像数据交互的有用模块,它接受 numpy 数组作为输入。一个很大的限制是图像数组必须有dtype='uint8'
,但只要没问题,该函数cv2.LUT
就会完全按照我们的意愿执行,并且它提供了显着的加速:
>>> import numpy as np
>>> import cv2
>>> lut = np.arange(256, dtype='uint8')
>>> image = np.random.randint(256, size=(5000, 5000), dtype='uint8')
>>> np.all(lut[image] == cv2.LUT(image, lut))
True
>>> import timeit
>>> timeit.timeit('lut[image]', 'from __main__ import lut, image', number=10)
0.5747578000000431
>>> timeit.timeit('cv2.LUT(image, lut)',
... 'from __main__ import cv2, lut, image', number=10)
0.07559149999997317
您的查找表可以是其他一些数据类型,但是您失去了很多速度改进(尽管 numpy 索引也会影响性能)。例如,使用dtype='float64'
:
>>> lut = np.arange(256, dtype='float64')
>>> timeit.timeit('lut[image]', 'from __main__ import lut, image', number=10)
1.068468699999812
>>> timeit.timeit('cv2.LUT(image, lut)',
... 'from __main__ import cv2, lut, image', number=10)
0.41085720000000947