GaussianFilter.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. from GrayscaleImage import GrayscaleImage
  2. from scipy.ndimage import convolve1d
  3. from pylab import ceil, zeros, pi, exp, sqrt, array
  4. class GaussianFilter:
  5. def __init__(self, scale):
  6. self.scale = scale
  7. def gaussian(self, x):
  8. """Return the value of a 1D Gaussian function for a given x."""
  9. return exp(-(x ** 2 / (2 * self.scale ** 2))) \
  10. / (sqrt(2 * pi) * self.scale)
  11. def get_1d_gaussian_kernel(self):
  12. """Sample a one-dimensional Gaussian function of scale s."""
  13. radius = int(ceil(3 * self.scale))
  14. size = 2 * radius + 1
  15. result = zeros(size)
  16. # Sample the Gaussian function
  17. result = array([self.gaussian(x - radius) for x in xrange(size)])
  18. # The sum of all kernel values is equal to one
  19. result /= result.sum()
  20. return result
  21. def get_filtered_copy(self, image):
  22. """Apply a gaussian blur to an image, to suppress noise."""
  23. kernel = self.get_1d_gaussian_kernel()
  24. image = convolve1d(image.data, kernel, axis=0, mode='nearest')
  25. return GrayscaleImage(None, convolve1d(image, kernel, axis=1, mode='nearest'))
  26. def filter(self, image):
  27. kernel = self.get_1d_gaussian_kernel()
  28. image.data = convolve1d(image.data, kernel, axis=0, mode='nearest')
  29. image.data = convolve1d(image.data, kernel, axis=1, mode='nearest')
  30. def get_scale(self):
  31. return self.scale
  32. def set_scale(self, scale):
  33. self.scale = float(scale)
  34. scale = property(get_scale, set_scale)