[GRASS-dev] [GRASS-user] Gauss filter in r.neighbors

Glynn Clements glynn at gclements.plus.com
Sat Oct 4 08:15:47 PDT 2014

```Can someone determine whether there's a problem with
"r.neighbors gauss=..." in 6.x?

Martin Album Ytre-Eide wrote:

> I followed you examples and it did not work in grass 6.4.4 so I
> tried them in grass7.1 and they worked for me as well.
>
> Tried my map - and it worked. I result looks good :)
>
> Thanks!
>
> (maybe there is a problem in r.neighbors for grass 6.4.4?)
>
> Martin
>
> ________________________________________
> Fra: Glynn Clements [glynn at gclements.plus.com]
> Sendt: 2. oktober 2014 14:27
> Til: Martin Album Ytre-Eide
> Kopi: grass-user at lists.osgeo.org
> Emne: Re: [GRASS-user] Gauss filter in r.neighbors
>
> Martin Album Ytre-Eide wrote:
>
> > I am using the the r.neighbors function and I have an idea about
> > what the 'Gauss' parameter will do for me, but I can't find any
> > documentation for it. Experimenting with it, left me clueless.
>
> Using gauss= is equivalent to using weight= with a weights file
> corresponding to a Gaussian filter.
>
> The exact weights which are used can be found in the
> gaussian_weights() function in raster/r.neighbors/readweights.c. They
> are effectively:
>
>         ncb.weights[i][j] = exp(-(x*x+y*y)/(2*sigma2))/(2*M_PI*sigma2);
>
> where x, y is the offset (in cells) from the centre of the
> neighbourhood and sigma2 is the square of the value passed to the
> gauss= option.
>
> > What I won't to do:
>
> > Apply a Gaussian weighting of cell neighbors and sum the values of
> > the neighbors. If all cells=1, I would get only 1's back.
>
> You need to use method=average to make the effective weights sum to
> one (when weights are used, method=average divides the weighted sum of
> the cell values by the sum of the weights).
>
> IIRC, the weights are such that they would sum to one if you had an
> infinitely-large neighbourhood, but the fact that you're cropping the
> curve to a finite neighbourhood means that the sum will always be less
> than one.
>
> The weights are determined by sigma alone, and are unaffected by the
> neighbourhood size.
>
> > I have a map of zeros and ones. I tried this:
> >
> > r.neighbors -c input='input_map' output='output_map' method=sum gauss=10 size=33
> >
> > The result is a map with only zeros.
>
> It works for me; e.g.
>
>         \$ r.mapcalc --o 'foo = rand(0,2)' seed=1
>         \$ r.neighbors --o -c in=foo out=bar method=average size=33 gauss=10
>         \$ r.info -r bar
>         min=0.442173333781042
>         max=0.568925311919939
>         \$ r.neighbors --o -c in=foo out=bar method=sum size=33 gauss=10
>         \$ r.info -r bar
>         min=0.0985901293262625
>         max=0.449425795562072
>
>         \$ r.mapcalc --o 'foo = 1'
>         \$ r.neighbors --o -c in=foo out=bar method=average size=33 gauss=10
>         \$ r.info -r bar
>         min=1
>         max=1
>         \$ r.neighbors --o -c in=foo out=bar method=sum size=33 gauss=10
>         \$ r.info -r bar
>         min=0.221413499330273
>         max=0.812157275619236

--
Glynn Clements <glynn at gclements.plus.com>
```