Время прочтения: 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 раз!

Рассмотренные библиотеки отличаются не только скоростью обработки изображений, но и алгоритмами, которыми они это делают. Результаты работы алгоритмов тоже отличаются. Предлагаем читателю провести собственное исследование используя образцы кода из статьи.