Время прочтения: 3 мин.
Для работы с изображениями в Python наиболее часто используют библиотеку PIL (Python Image Library) и поисковые системы выдадут нам несколько решений только с использованием PIL, прежде чем предложат что-то другое.
На помощь способны прийти технологии компьютерного зрения, а именно – библиотека OpenCV. Что такое OpenCV? — библиотека компьютерного зрения и машинного обучения с открытым исходным кодом. В неё входят более 2500 алгоритмов, в которых есть как классические, так и современные алгоритмы для компьютерного зрения и машинного обучения. Реализована на C/C++, также разрабатывается для Python, Java, Ruby, Matlab, Lua и других языков. Может свободно использоваться в академических и коммерческих целях — распространяется в условиях лицензии BSD.
Условия тестирования:
- тестовое изображение с разрешением 700 на 700 пикселей;
- вычисления производились на процессоре Intel Core i3-2120.
Примеры кода и результаты замеров производительности
Подключаем библиотеки:
from PIL import Image
import cv2
from timeit import Timer
открываем тестовое изображение обеими библиотеками:
image_file_PIL = Image.open("convert_image.jpg")
image_file_OpenCV = cv2.imread("convert_image.jpg")
функции, которые будем вызывать для преобразования изображения по 5000 раз:
def convert_to_monochrome_by_PIL(image_file, repeats):
for i in range (repeats):
gray = image_file.convert('L')
def convert_to_monochrome_by_OpenCV(image_file, repeats):
for i in range (repeats):
gray = cv2.cvtColor(image_file, cv2.COLOR_BGR2GRAY)
def resize_to_half_by_PIL(image_file, repeats, size):
for i in range(repeats):
small = image_file.resize(size)
def resize_to_half_by_OpenCV(image_file, repeats, size):
for i in range(repeats):
small = cv2.resize(image_file,size)
совершаем по 5000 итераций преобразования нашего тестового изображения к монохромному замеряя время выполнения. Этот тест проводим 100 раз и берем средний результат:
t = Timer(lambda: convert_to_monochrome_by_PIL(image_file_PIL, 5000))
print (t.timeit(number=100)/100)
t = Timer(lambda: convert_to_monochrome_by_OpenCV(image_file_OpenCV, 5000))
print (t.timeit(number=100)/100)
Разница больше трех раз.
совершаем по 5000 итераций изменения разрешения нашего тестового изображения на 100 на 100 пикселей замеряя время выполнения. Этот тест также проводим 100 раз и берем средний результат:
t = Timer(lambda: resize_to_half_by_PIL(image_file_PIL, 5000, (100, 100)))
print (t.timeit(number=100)/100)
t = Timer(lambda: resize_to_half_by_OpenCV(image_file_OpenCV, 5000, (100, 100)))
print (t.timeit(number=100)/100)
Разница более 59 раз!
Рассмотренные библиотеки отличаются не только скоростью обработки изображений, но и алгоритмами, которыми они это делают. Результаты работы алгоритмов тоже отличаются. Предлагаем читателю провести собственное исследование используя образцы кода из статьи.