Поскольку ваш код неполон, я могу только догадываться, что может помочь, поэтому вот несколько мыслей ...
Я начал с изображения 1200x1200, потому что я не знаю, насколько велик ваш,и уменьшил его в 0,8x раз до 960x960 из-за комментариев в вашем коде.
Мои идеи по его ускорению основаны либо на использовании другого метода интерполяции, либо на использовании OpenCV, который является высоко оптимизированным SIMD-кодом,Либо, либо оба могут быть подходящими, но, поскольку я не знаю, как выглядят ваши изображения, только вы можете сказать.
Итак, начнем с PIL resize()
и различных методов интерполяции:
# Open image with PIL
i = Image.open('start.png').convert('RGB')
In [91]: %timeit s = i.resize((960,960), Image.BICUBIC)
16.2 ms ± 28 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [92]: %timeit s = i.resize((960,960), Image.BILINEAR)
10.9 ms ± 87.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [93]: %timeit s = i.resize((960,960), Image.NEAREST)
440 µs ± 10.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Итак, BILINEAR в 1,5 раза быстрее, чем BICUBIC, и реальный победитель здесь - БЛИЖАЙШИЙ в 32 раза быстрее.
Теперь, преобразование в массив Numpy (как вы делаете в любом случае) ииспользуя оптимизированный код OpenCV SIMD для изменения размера:
# Now make into Numpy array for OpenCV methods
n = np.array(i)
In [100]: %timeit s = cv2.resize(n, (960,960), interpolation = cv2.INTER_CUBIC)
806 µs ± 9.81 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [101]: %timeit s = cv2.resize(n, (960,960), interpolation = cv2.INTER_LINEAR)
3.69 ms ± 29 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [102]: %timeit s = cv2.resize(n, (960,960), interpolation = cv2.INTER_AREA)
12.3 ms ± 136 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [103]: %timeit s = cv2.resize(n, (960,960), interpolation = cv2.INTER_NEAREST)
692 µs ± 448 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
И победитель здесь выглядит как INTER_CUBIC, который в 20 раз быстрее PIL resize()
.
Пожалуйста, попробуйте их все и посмотрите, что работаетдля тебя!Просто удалите магию Питона %timeit
в начале строки и запустите то, что осталось.