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

Home » Public Forums » archive » Re: Moving window on an image
Show: Today's Messages :: Show Polls :: Message Navigator
E-mail to friend 
Switch to threaded view of this topic Create a new topic Submit Reply
Re: Moving window on an image [message #67667] Sat, 15 August 2009 12:35
David Fanning is currently offline  David Fanning
Messages: 11724
Registered: August 2001
Senior Member
David Fanning writes:

> Jeff N. writes:
>
>> Why do you need to add 2 to the indices returned by value_locate()
>> here? I can see why you'd need to add 1 to them, but not 2.
>
> If Value_Locate doesn't find *any* values in a particular
> range, it returns a -1. I can histogram values -1 to 6, but
> it seems to make more intuitive sense to histogram values
> 1 to 8 in this case.

If anyone else is struggling with the details of this,
I have written an article on the subject, which explains
the procedure in a bit more detail than I have included here.

http://www.dfanning.com/idl_way/smregval.html

Cheers,

David

--
David Fanning, Ph.D.
Fanning Software Consulting, Inc.
Coyote's Guide to IDL Programming: http://www.dfanning.com/
Sepore ma de ni thui. ("Perhaps thou speakest truth.")
Re: Moving window on an image [message #67668 is a reply to message #67667] Sat, 15 August 2009 12:29 Go to previous message
David Fanning is currently offline  David Fanning
Messages: 11724
Registered: August 2001
Senior Member
Jeff N. writes:

> Why do you need to add 2 to the indices returned by value_locate()
> here? I can see why you'd need to add 1 to them, but not 2.

If Value_Locate doesn't find *any* values in a particular
range, it returns a -1. I can histogram values -1 to 6, but
it seems to make more intuitive sense to histogram values
1 to 8 in this case.

Cheers,

David



--
David Fanning, Ph.D.
Fanning Software Consulting, Inc.
Coyote's Guide to IDL Programming: http://www.dfanning.com/
Sepore ma de ni thui. ("Perhaps thou speakest truth.")
Re: Moving window on an image [message #67669 is a reply to message #67668] Sat, 15 August 2009 12:09 Go to previous message
jeffnettles4870 is currently offline  jeffnettles4870
Messages: 111
Registered: October 2006
Senior Member
David,

Why do you need to add 2 to the indices returned by value_locate()
here? I can see why you'd need to add 1 to them, but not 2.

Jeff
Re: Moving window on an image [message #67670 is a reply to message #67669] Sat, 15 August 2009 05:31 Go to previous message
David Fanning is currently offline  David Fanning
Messages: 11724
Registered: August 2001
Senior Member
IDL beginner writes:

> I am new IDL user and I need your help in the following question:
>
> I have an image with values between 1 and 8 and I need to create a 5x5
> window that will move step by step over each pixel of the image. The
> window over each pixel will count how many pixels around the center
> pixel have the value 1, 2, 3 ..., or 8.
>
> I do not know how to do that and how can I deal with the pixels on the
> boarders of the image because some of the window elements will fall
> outside the image.

How about something like this. First, create an appropriate
data set. (Small enough to check results.)

array = Fix(Scale_Vector(Randomu(-3L, 10, 10), 1, 9))

Now, the answers will be in a 10x10x8 array, as there will
be a 2D answer array for each value, 1 through 8.

s = Size(array, /DIMENSIONS)
answers = LonArr(s[0], s[1], 8)

Partition the array into the 8 values, and find the indices
representing these 8 values:

cutoff = [1,2,3,4,5,6,7,8]
h = Histogram(Value_Locate(cutoff, array) + 2, REVERSE_INDICES=ri)

We will need a mask to select each of the 8 values, in turn.

mask = BytArr(s[0], s[1])

Now, get the answers and put them in the answers array. Note
that ONLY the pixels surrounding the center pixel (as the
requirements stated) are counted. The center pixel is not
counted.

FOR j=0L,7 DO BEGIN
mask = mask * 0B
kernel = Replicate(1.0/(j+1), 5, 5)
kernel[2,2] = 0 ; Center pixel not counted.
mask[ri[ri[j]:ri[j+1]-1]] = 1
answers[0,0,j] = Convol(Float(array) * mask, kernel, /EDGE_ZERO)
ENDFOR

The entire program (as a main level program) is here:

;*********************************************************** ********
array = Fix(Scale_Vector(Randomu(-3L, 10, 10), 1, 9))
s = Size(array, /DIMENSIONS)
answers = LonArr(s[0], s[1], 8)
cutoff = [1,2,3,4,5,6,7,8]
h = Histogram(Value_Locate(cutoff, array) + 2, REVERSE_INDICES=ri)
mask = BytArr(s[0], s[1])
FOR j=0L,7 DO BEGIN
mask = mask * 0B
kernel = Replicate(1.0/(j+1), 5, 5)
kernel[2,2] = 0 ; Center pixel not counted.
mask[ri[ri[j]:ri[j+1]-1]] = 1
answers[0,0,j] = Convol(Float(array) * mask, kernel, /EDGE_ZERO)
ENDFOR
END
;*********************************************************** ********

How does it work? Save it as "example.pro".

IDL> .run example
IDL> Print, array, FORMAT='(10I3)'
8 5 7 5 1 8 1 2 2 8
8 8 7 2 2 7 1 6 1 1
6 1 2 1 3 3 6 6 3 4
5 2 8 6 5 7 7 4 5 8
6 7 2 3 7 7 1 6 2 4
4 4 8 4 6 5 3 5 2 2
7 8 4 3 2 5 7 4 1 2
7 2 6 2 1 8 5 2 7 4
7 3 4 3 5 8 2 2 6 3
5 4 5 6 9 3 1 5 1 5

How many ones are there?

IDL> Print, answers[*,*,0], FORMAT='(10I3)'
1 2 3 3 3 4 3 4 4 2
1 2 3 3 4 4 3 4 3 1
1 1 3 2 5 5 5 5 5 2
1 2 2 2 3 3 3 4 4 2
1 2 2 2 2 2 1 2 2 1
0 0 1 1 2 2 3 2 2 1
0 0 1 1 2 2 3 2 1 1
0 0 1 1 1 2 4 3 3 2
0 0 1 1 2 2 4 3 3 2
0 0 1 1 2 2 2 2 1 1

How many fives are there:

IDL> Print, answers[*,*,4], FORMAT='(10I3)'
1 1 2 1 1 1 0 0 0 0
2 3 4 3 2 2 2 1 1 1
2 3 4 3 2 2 2 1 1 1
0 1 2 2 1 3 4 3 1 2
1 1 2 3 3 4 5 4 2 2
1 1 2 3 4 4 6 4 3 2
0 0 1 3 4 4 5 4 2 1
2 2 3 4 5 6 5 6 4 3
2 2 3 3 3 4 4 4 3 2
1 2 2 2 3 3 3 2 3 1

Cheers,

David
--
David Fanning, Ph.D.
Fanning Software Consulting, Inc.
Coyote's Guide to IDL Programming: http://www.dfanning.com/
Sepore ma de ni thui. ("Perhaps thou speakest truth.")
  Switch to threaded view of this topic Create a new topic Submit Reply
Previous Topic: Moving window on an image
Next Topic: What a Wild, Wacky Place

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

Current Time: Fri Oct 10 11:16:12 PDT 2025

Total time taken to generate the page: 0.71986 seconds