
# Approximate Gaussian blur for 2D uint8 numpy arrays using iterated box blur.
# This is faster than skimage or scipy's Gaussian blur for large sigma.

def iteratedBoxBlur(I, r, n=3):
	assert I.dtype == 'uint8'
	I = Image.fromarray(I)
	for i in range(n):
		I = I.filter(ImageFilter.BoxBlur(r))
	return numpy.asarray(I)

def approxGaussianBlur(I, sigma, n=3):
	# Variance of U[-r, r]: r**2/3
	# Variance of sum of n i.i.d. uniform distributions: nr**2/3 = sigma**2
	r = numpy.sqrt(sigma**2 * 3.0 / n)
	return iteratedBoxBlur(I, r, n)

