[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: efficient kernel or masking algorithm ? UPDATE



Martin Downing wrote:
> 
> From thread: http://cow.physics.wisc.edu/~craigm/idl/archive/msg03957.html
> a.. Date: Wed, 29 Nov 2000 16:30:54 -0500
> Richard Tyc wrote:
> >
> > I need to apply a smoothing type kernel across an image, and calculate the
> > standard deviation of the pixels masked by this kernel.
> >
> > ie. lets say I have a 128x128 image.  I apply a 3x3 kernel (or simply a
> > mask) starting at [0:2,0:2] and use these pixels to find the standard
> > deviation for the center pixel [1,1] based on its surrounding pixels, then
> > advance the kernel etc deriving a std deviation image essentially.
> > I can see myself doing this 'C' like with for loops but does something
> exist
> > for IDL to do it better or more efficiently ?
> >
> > Rich
> 
> I was wandering through new Craig's IDL archive site (which is brilliant by
> the way) and came across this question asking for an efficient way of
> calculating the loacal standard deviation in an array. It seemed to me that
> the thread had not reached a full solution so perhaps some of you might be
> interested in this method which is very fast. It is based on the crafty
> formula for variance:
>   variance = (sum of the squares)/n + (square of the sums)/n*n

Righto.  I knew I was fishing for something like this.  Except I think you mean: 

(population) variance = (sum of the squares)/n - (square of the sums)/n*n

Luckily, that's how you've coded it too.  Sample variance (=population
variance*n/(n-1)) is of course the more common case in science (as opposed to
gambling).

JD

P.S. I think I originally got the idea from sigma_filter.pro, a NASA library
routine, dating back to 1991.  It's chock-full of other good tidbits too. 
Thanks Frank and Wayne!