Hi all,
I'm new to PDL and semi-proficient with Perl at best. I'm posting this a
last resort after *lots* of frustration while trying to combine a set of
RGB images of dimensionality [3, N, M] using a selective averaging
technique often used in astrophotography called sigma clip (see
http://www.ccdware.com/support/presentations/advanced_image_combine_gralak20081116.pdf).
The images are generated iteratively and the set size is not known in
advance.
I append the images into a 4D array on every iteration using glue(). Of
course I'm open to alternatives...
I'm seriously stuck on actually combining the [3, N, M, n] image stack
after n iterations using sigma clipping. This requires getting the [N, M]
mean and standard deviation (sigma) from the pixel luminance (average over
RGB), then averaging the stacked images using only those pixels whose
deviation from the mean is within some factor of sigma. This effectively
rejects outliers.
Here's what I have so far...
----------------------------------------------------------------------------------------------------
use constant SIGMACLIP => 0.5;
my $imgStack;
do {
...
# Append new image $img to stack, adding 4th dimension
$imgStack = defined $imgStack ? $imgStack -> glue(3, $img) : $img;
...
# Get mean and std deviation for RGB average (= luminance) of all images
my $imgStackLum = average($imgStack);
# [N, M, n] --> [n, N, M]
my ($mean, undef, undef, undef, undef, undef, $sigma) =
statsover($imgStackLum -> reorder(2,0,1));
# Add 3rd dim to mean for subtraction
my $imgStackDiff = $imgStackLum - $mean -> dummy(2);
# Get mask array containing non-clipped pixels
$sigma *= SIGMACLIP;
my $mask = (abs($imgStackDiff) < $sigma);
# Selectively combine $imgStack into selectively averaged [3, N, M]
image based on $mask
$hdrComb = where($hdrStack, $mask)... -> average; ???
...
} until (converged);
----------------------------------------------------------------------------------------------------
Note that I have to redo this for every iteration, which is anything but
efficient. Again, I'm open to suggestions for optimisation... once it's
working.
This is all pretty standard stuff, so nothing exotic, and I'll bet
somebody's done it in PDL. I couldn't find any hints in the archives tho.
(Apparently the search function in the recent archives is broken, btw).
Any help appreciated. Many thanks & best regards,
--Roland
--
Dr. Roland Schregle
Senior Research Associate
T direct: +41 41 349 39 77
[email protected]
Lucerne University of Applied Sciences and Arts
School of Engineering and Architecture
CC Envelopes and Solar Energy (EASE)
Technikumstrasse 21, CH-6048 Horw
T +41 41 349 33 11, F +41 41 349 39 60
www.hslu.ch/ccease
_______________________________________________
Perldl mailing list
[email protected]
http://mailman.jach.hawaii.edu/mailman/listinfo/perldl