Re: Calculate the mean of many images [message #63646 is a reply to message #63645] |
Sun, 16 November 2008 12:04   |
Craig Markwardt
Messages: 1869 Registered: November 1996
|
Senior Member |
|
|
On Nov 16, 1:30 pm, Bulrush <Wasit.Weat...@gmail.com> wrote:
> On Nov 16, 2:54 am, Craig Markwardt <cbmarkwa...@gmail.com> wrote:
>
>
>
>> On Nov 16, 1:16 am, Bulrush <Wasit.Weat...@gmail.com> wrote:
>
>>> Hello,
>>> I know this topic has been posted several times. But I could not find
>>> my answer from these posted.
>>> My issue is: I have many images 2 bands in each, one image is QA image
>>> and the other one is data.
>>> I need to calculate the mean of good pixels. Let's say QA image tells
>>> me the location of good pixels, e.g. 1 for good pixels, and other for
>>> bad. There are also NaN values. So, if the pixels are "good" in 7
>>> images out of ten, then
>>> (pixel1+pixel2...+Pixel7) /7
>
>> I would loop over input images, and keep track of the cumulative sum
>> of the number of valid pixels (NPIX), and the cumulative sum of the
>> pixel values (SUM). Something like the following. Since there are
>> only a few images, there will be very little overhead in the FOR-loop.
>
>> Craig
>
>> npix = 0 & sum = 0
>> for i = 0, n_images-1 do begin
>> qa = ... the ith QA image ...
>> img = ... the ith image ...
>> mask = (qa EQ 1) AND (finite(img) EQ 1)
>
>> ;; Sum valid pixels
>> npix += mask
>> wh = where(mask, ct)
>> if ct GT 0 then sum(wh) += img(wh)
>> endfor
>
>> ;; Positions where there are good pixels
>> qa_avg = (npix GT 0)
>> wh = where(qa_avg EQ 1)
>
>> ;; Compute average for valid pixels
>> avg = sum*0
>> avg(wh) = sum(wh) / npix(wh)
>
> Thanks for all the comments. I think Craig's method would work for me.
> the Actual QA image contains more than one value, such as 0.00 (good
> pixel), 1.000 (between good and band), 2.000 (cloud), 3.000(snow),
> etc.
> What does finite(img) EQ 1 mean here? Can I write this statement as
> the following?
>
> mask = (qa EQ 1.000 and qa EQ 0.000 ) AND (finite(img) EQ 1.000 &&
> 0.000)
As Chris points out, this is a logically inconsistent expression.
Probably you want,
(qa EQ 1 OR qa EQ 0)
for the first part of your expression.
I'm not sure what you are getting at from the second part of the
expression. FINITE(img) is 0 if the pixel value is infinite or NaN, 1
otherwise. Looks like your "&& 0.000" is superfluous.
To answer your other question: the WHERE occurs a few lines later.
I'm using a MASK since you need to accumulate the number of pixels as
well as the pixel values.
|
|
|