Пытаюсь реализовать простейший 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 изображении. Так не должно быть! =)
Я знаю, что мне поможет многопоточность и параллелизация, но это не решение проблемы.
Где моя ошибка? Прошу о помощи.