import ImageFilter, math class GaussianBlurFilter(ImageFilter.Kernel): def __init__(self, radius=5.0): # cf. http://mikecheng.d2.net.au/selgauss/selgauss.c nconv = int(radius * math.sqrt(-math.log(0.1)/math.log(2.0))) + 1 size = 2 * nconv - 1 kernel = [ 0 ] * size * size def store(x, y, v): i = size * y + x #print x, y, i kernel[i] = v k = nconv - 1 for y in xrange(0, nconv): for x in xrange(0, nconv): r = math.sqrt(x*x + y*y) v = math.exp(-math.log(2)*math.pow(r/radius,2)) store(k-x, k-y, v) store(k+x, k-y, v) store(k-x, k+y, v) store(k+x, k+y, v) if 0: for i in xrange(0, len(kernel)): print '%4.2f' % kernel[i], if (i+1) % size == 0: print print norm = reduce(lambda a,b: a+b, kernel) self.filterargs = (size, size), norm, 0, kernel