Advertisement
gmlscripts

ds_grid_filter_gaussian

Sep 2nd, 2014
387
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /// ds_grid_filter_gaussian(grid,sigma)
  2. //
  3. //  Performs a Gaussian convolution on a given grid.
  4. //
  5. //      grid        grid data structure, id
  6. //      sigma       standard deviation, real
  7. //
  8. /// GMLscripts.com/license
  9. {
  10.     var grid = argument0;
  11.     var sigma = argument1;
  12.  
  13.     if (sigma > 0)
  14.     {
  15.         //  Select suitable filter size for sigma
  16.         var size = ceil(6*sigma);
  17.         var n = 2*sqr(sigma);
  18.         var d = 1/(sqrt(2*pi)*sigma);
  19.  
  20.         //  Compute Gaussian coefficients
  21.         var g;
  22.         for (var i=size; i>=0; i--)
  23.         {
  24.             g[i] = exp(-sqr(i)/n)*d;
  25.         }
  26.  
  27.         //  Create working grids
  28.         var w = ds_grid_width(grid);
  29.         var h = ds_grid_height(grid);
  30.  
  31.         var work1 = ds_grid_create(w,h);
  32.         var work2 = ds_grid_create(w,h);
  33.  
  34.         //  Filter horizontally
  35.         ds_grid_copy(work1,grid);
  36.         ds_grid_multiply_region(work1,0,0,w-1,h-1,g[0]);
  37.         for (i=1; i<=size; i++)
  38.         {
  39.             ds_grid_copy(work2,grid);
  40.             ds_grid_multiply_region(work2,0,0,w-1,h-1,g[i]);
  41.             ds_grid_add_grid_region(work1,work2,0,0,w-1,h-1,i,0);
  42.             ds_grid_add_grid_region(work1,work2,0,0,w-1,h-1,-i,0);
  43.         }
  44.  
  45.         //  Filter vertically
  46.         ds_grid_copy(grid,work1);
  47.         ds_grid_multiply_region(grid,0,0,w-1,h-1,g[0]);
  48.         for (i=1; i<=size; i++)
  49.         {
  50.             ds_grid_copy(work2,work1);
  51.             ds_grid_multiply_region(work2,0,0,w-1,h-1,g[i]);
  52.             ds_grid_add_grid_region(grid,work2,0,0,w-1,h-1,0,i);
  53.             ds_grid_add_grid_region(grid,work2,0,0,w-1,h-1,0,-i);
  54.         }
  55.  
  56.         //  Clean up
  57.         ds_grid_destroy(work1);
  58.         ds_grid_destroy(work2);
  59.     }
  60.     return 0;
  61. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement