comp.lang.idl-pvwave archive
Messages from Usenet group comp.lang.idl-pvwave, compiled by Paulo Penteado

Home » Public Forums » archive » Best way to move a window
Show: Today's Messages :: Show Polls :: Message Navigator
E-mail to friend 
Return to the default flat view Create a new topic Submit Reply
Re: Best way to move a window [message #29641 is a reply to message #29532] Fri, 01 March 2002 06:16 Go to previous messageGo to previous message
Ned Horning is currently offline  Ned Horning
Messages: 6
Registered: March 2001
Junior Member
Jaco,

Thanks for the advice. It looks like I need to get more creative with
CONVOL.

I am trying to detect ridges in a digital elevation model. I'm making
the assumption that the sides of a ridge are sloping away from the
ridgeline at roughly a 90 degree angle (i.e., if the ridge is
north-south the west side of the ridge should have a west aspect) and
the two sides of the ridge are roughly opposed (within a tolerance of
t and s).

The reason I do the 180 check is because flat areas are assigned an
aspect of 180 degrees and that really messes things up.

I also need to figure out how to calculate the mean of a moving window
and work with a circular window but first I need to get this working
faster.

Thanks again for your help.

Ned

On Fri, 1 Mar 2002 13:49:33 +0100, "Jaco van Gorkom"
<j.c.van.gorkom@fz-juelich.de> wrote:

> "Ned Horning" <nedh@lightlink.com> wrote in message
> news:uvis7ug8kfc4qtlnllpqj3223m19bo3pd3@4ax.com...
>> Thanks Marc, this is pretty slick and it helps a lot. Unfortunately I
>> just realized that I didn't post the second half of the window
>> routine. After doing the "abs(tile_data - 180) lt 0.0001)" test I
>> continue with:
>>
>> s= 45
>> t=45
>> IF (((ABS(tile_data[x+1,y+1] - 45) le s) AND (ABS(tile_data[x-1,y-1] -
>> tile_data(x+1,y+1) -180) le t)) OR $
>> ((ABS(tile_data[x+1,y] - 90) le s) AND (ABS(tile_data[x-1,y] -
>> tile_data(x+1,y) -180) le t)) OR $
>> ((ABS(tile_data[x+1,y+1] - 135) le s) AND (ABS(tile_data[x-1,y+1] -
>> tile_data(x+1,y-1) -180) le t)) OR $
>> ((ABS(tile_data[x,y-1] - 180) le s) AND (ABS(ABS(tile_data[x,y+1] -
>> tile_data(x,y-1)) -180) le t))) THEN $
>> out_tile[y*num_tile_samples+x] = 1 ELSE $
>> out_tile[y*num_tile_samples+x] = 0
>>
>> What this does is compares opposing pixels (top and bottom, left and
>> right, upper left lowerright, upper right and lower left) and I'm
>> trying to see how to use the where/convolution logic for this and not
>> having much luck.
>
> Well, two options spring to mind:
> - use the SHIFT() function, e.g. for left-right:
> shiftleft = SHIFT(tile_data, -1, 0) & shiftright = SHIFT(tile_data, 1, 0)
> expression:
> ( ABS(shiftleft - 90) LE s ) AND ( ABS(shiftright - shiftleft - 180) LE
> t )
>
> - use CONVOL() with kernels like [-1,0,1] for left-right, [[-1],[0],[1]]
> for top-bottom, and 3x3 arrays for the diagonals. For left-right:
> expression:
> ( ABS(shiftleft - 90) LE s ) AND $
> ( ABS( CONVOL(tile_data, [-1,0,1]) - 180) LE t )
>
> Then it should be possible to OR the above expressions directly together
> and AND them into out_tile. If most of the elements get selected already
> in the first half (180. being in their neigbourhood), then a loop over the
> remaining elements might be a faster solution for this second half.
>
> Getting totally confused about what this routine is actually doing,
> Jaco
>
>
[Message index]
 
Read Message
Read Message
Read Message
Previous Topic: Vectorizing Code
Next Topic: Resize procedure,

-=] Back to Top [=-
[ Syndicate this forum (XML) ] [ RSS ] [ PDF ]

Current Time: Thu Oct 16 20:51:19 PDT 2025

Total time taken to generate the page: 1.64615 seconds