[GRASS5] Gaussian filter for GRASS

Jachym Cepicky jachym.cepicky at centrum.cz
Thu Apr 21 14:47:01 EDT 2005

thank you very much for your hints! No I try to rewrite it some better way.

On Thu, Apr 21, 2005 at 07:06:39PM +0100, Glynn Clements wrote:
> Jachym Cepicky wrote:
> > I have tryed to program the Gaussian filter for raster maps. It
> > works only with CELL maps for now, but I hope to extend it for DCELL
> > and FCELL maps too.
> The simplest solution is to use DCELL throughout. All CELL and FCELL
> values can be represented as DCELL without loss of range or precision.

OH! I didn't know this! I have to read it in the Programers manual - I
thought, DCELL is just 'some' another type of map :-( 

> > Because this is my first raster module for GRASS and also my first bigger
> > C-program, I would be very thankfull, if someone could have a look at the 
> > code at to tell me, what I could do better/safer.
> Use a scrolling window; don't read each row three times.
> At the moment, you're reading rows 0/1/2, then 1/2/3, then 2/3/4 and
> so on. Note that you're reading each row (except the first and last
> two) three times. Also note that you already have two out of the three
> rows in memory from the previous pass (again, except for the first and
> last two passes).
> See r.neighbors or r.grow2.

I looked there, but I did not see it. Thanks again...
> Actually, is there any reason why this filter can't be added to
> r.neighbors as another method?

Well, I wanted somehow to start to write my own modules. Gaussian is not much complicated
filter, but mean of least variance, bilateral filter and others will be a bit
complicated (well - I thing so). So I wanted to start somehow, so I know, how to
write a module from the beginning. I learned  very much on this.

> > I would like to write some other filters for raster maps too, the next stage
> > should be Mean of least variance filter. But before I start, I would like to be
> > shure, that I don't do something really stupid in the program.
> > 
> > I could not to solve, how to work on the boundaries of the raster. I had to
> > skip these cells, like e.g. r.mapcalc does -- so NULL values appear there. 
> > How to do it some better way?
> In general, you can't. Convolution-style filters always result in the
> map being "shrunk".

But one could count the value of the central cell only from the values, which
are laying in the raster

| 1| 2| 3| 4|   So for cell number 1, one would take the cells 1,2,5 and 6 
+-----------+   in the count. For number 2, One would take 1,2,3,5,6,7
| 5| 6| 7| 8|   first for cell number 6, one would take all 9 values around.
| 9|10|11|12|   But it would be too complicated tough :-/
> > I'm also not shure, if I do the allocation of neigborhood rows the right way.
> > 
> > I hope, I did not forget to free all the buffers at the end.
> It doesn't matter about freeing buffers; all memory will be reclaimed
> by the OS when the program terminates.

Oh, I did! I did it by realy BAD way: For each CELL I allocated the 3 rows
again!! And than I forget to free it! But it is all right now.
> -- 
> Glynn Clements <glynn at gclements.plus.com>

OK, I will work with DCELL type, than I implement the row swiching from r.grow2

		tmp = in_rows[0];
		for (i = 0; i < size * 2; i++)
			in_rows[i] = in_rows[i + 1];
		in_rows[size * 2] = tmp;

This is a good trick and I post the result again, so you and others could have
a look at it.

Now it works nearly 2x faster, than r.mapcalc filter (from GRASS add-ons). With
these modifications, it will be even better!

Thank you again

Jachym Cepicky
e-mail: jachym.cepicky at centrum.cz
URL: http://les-ejk.cz
GPG: http://www.fle.czu.cz/~jachym/gnupg_public_key/

More information about the grass-dev mailing list