[GRASSLIST:4893] Re: conditional growing of a region

Roger Bivand Roger.Bivand at nhh.no
Wed Nov 6 06:09:37 EST 2002

> Dear all,
> I have been trying to regionalise a DEM into particular landforms. In
> this instance, I am after identifying terraces. My original attempt was
> with a classification type method whereby I identified threshold in
> variables such as slope gradients and flatness. While this is one  way
> of dealing with this question, I am a little disappointed by the
> results because they don't respect the visual geomorphological
> interpretation of the landscape. It is striking that terraces are chunks
>  of land with a particular aspect and slope value (shallow slope
> obviously), yet thresholding the slope and aspect ignore the
> topological adjacency of pixels. Therefore, I'd like to build an
> algorithm that would work like the "magic wand" in photoshop. That  is a
> method that looks at the characteristics of a seed point and test  the
> membership of adjacent pixels according to some decision rule.
> In practical terms, how does one go about comparing each pixel of  a
> buffer zone to a seed point. I found the r.grow module which will  do to
> expand the seed point by one pixel in all direction, but once  this ring
> of neighbours is determined, how does one test them one  by one? Or is
> there more nifty trick to deal with this?

You can get quite a long way with the indices used by r.mapcalc:

layer[-1,-1] is offset left and down (check the manual - directions are
not always intuitive!!) by one cell from the [0,0] cell.

You could also look at r.mfilter - by designing a filter matrix, you can
"package" the comparison style you would like without having to repeat
r.mapcalc scripts. I would try with r.mapcalc first to get a feel for
things, then convert your best filter to an r.mfilter matrix. For
instance, Chrisman's textbook has a filter example on p. 166 (1st edition)
of a slope filter:

TITLE 3x3 Sobel x filter
-1 0 1
-2 0 2
-1 0 1

TITLE 3x3 Sobel y filter
-1 -2 -1
0 0 0
1 2 1

with pseudo-code to filter:

slope.in.x = Filter elevation
      using "Sobel x filter";
slope.in.y = Filter elevation
      using "Sobel y filter";
slope = sqrt((slope.in.x ^ 2)
      + (slope.in.y ^ 2));

An r.mfilter matrix for taking the average of N, S. E, and W cells - one
step - is:

TITLE 3x3 rook's move
0 1 0
1 0 1
0 1 0

r.mfilter gives lots of flexibility, matrices can be bigger, and you can
fine-tune the filtering to pick out the kinds of things you need -
provided they don't change too much across the region (aspect might if
valleys curve).


> Thanks for your help,
> Thomas
> Thomas Dewez
> PhD Student
> Dept Geography & Earth Sciences
> Brunel University (West London)
> Uxbridge UB8 3PH, Mddx
> United Kingdom
> Phone: +44-(0)1895-203215
> Fax:     +44-(0)1895-203217
> e-mail: thomas.dewez at brunel.ac.uk

Roger Bivand
NHH, Breiviksveien 40, N-5045 Bergen, Norway
(travelling but still accessible)

More information about the grass-user mailing list