I could not see a gaussian filter in the python imaging library, but its simple enough to write one…
import ImageFilter
from PIL import Image
from numpy import *
def gaussian_grid(size = 5):
"""
Create a square grid of integers of gaussian shape
e.g. gaussian_grid() returns
array([[ 1, 4, 7, 4, 1],
[ 4, 20, 33, 20, 4],
[ 7, 33, 55, 33, 7],
[ 4, 20, 33, 20, 4],
[ 1, 4, 7, 4, 1]])
"""
m = size/2
n = m+1 # remember python is 'upto' n in the range below
x, y = mgrid[-m:n,-m:n]
# multiply by a factor to get 1 in the corner of the grid
# ie for a 5x5 grid fac*exp(-0.5*(2**2 + 2**2)) = 1
fac = exp(m**2)
g = fac*exp(-0.5*(x**2 + y**2))
return g.round().astype(int)
class GAUSSIAN(ImageFilter.BuiltinFilter):
name = "Gaussian"
gg = gaussian_grid().flatten().tolist()
filterargs = (5,5), sum(gg), 0, tuple(gg)
im = Image.open('/home/rcjp/tmp/test.png')
im1 = im.filter(GAUSSIAN)
im1.save('/home/rcjp/tmp/testfiltered.png')



Thanks. I am using a normal pdf to disperse a 2d spatial population at each time step in a grid map. This is close to what i need.
Jon
Comment by Jon Allen — August 7, 2009 @ 1:55 pm