Задать вопрос

Слишком медленная обработка изображений на Python с PIL + NumPy

Пытаюсь реализовать простейший blur-фильтр на питоне:

import os, sys, time
import Image, ImageEnhance
import numpy as np

if (len(sys.argv) > 1):
    im = Image.open(sys.argv[1])
    data = np.array(im.resize((128,128)))
    out_data = np.array(data)
    chs = len(data[0][0])
    im_size = (data.shape[0], data.shape[1])

    #defining filter kernel (mask)
    #let's believe it's square anytime
    kernel = np.array([[1.,2,1],
                       [2,3,2],
                       [1,2,1]])
    ctr = 1
    ker_size = kernel.shape[0]
    kernel = kernel/np.sum(kernel)

    #let's go looping!
    start_time = time.time()
    #loop over image dimensions
    for x in xrange(im_size[0]):
        for y in xrange(im_size[1]):
            #loop over channels
            for c in xrange(chs):
                acc = 0
                #loop over kernel
                for i in xrange(ker_size):
                    for j in xrange(ker_size):
                        m = x + i - ctr
                        n = y + j - ctr
                        if (m >= 0 and n >= 0 and m < im_size[0] and n < im_size[1]):
                            acc += data[m][n][c]*kernel[i][j]
                out_data[x][y][c] = acc
    elapsed = time.time() - start_time

    #it's over, let's do the rest
    out = Image.new(im.mode, (im_size[0], im_size[1]))
    out = Image.fromarray(out_data)
    out.show()
    print elapsed, "sec."
else:
    print "no file was passed"


4 секунды на 128х128 RGB изображении. Так не должно быть! =)
Я знаю, что мне поможет многопоточность и параллелизация, но это не решение проблемы.
Где моя ошибка? Прошу о помощи.
  • Вопрос задан
  • 4013 просмотров
Подписаться 6 Оценить 1 комментарий
Ответ пользователя radioxoma К ответам на вопрос (8)
@radioxoma
А зачем? Кстати, в opencv они побыстрее будут.

P.S. И многопоточность вам не поможет.
Ответ написан
Комментировать