r - How to interpolate noise values on a landsat image time series using cfmask flag data? -


i need create function interpolate noise values on landsat image time series mean on time span of 2 (xt+1 , xt-1).

i´m using fmask product detect cloud , shadow, interpolation applied.

for 1 time series:

since c2 vector of fmask time series (2 cloud , 4 shadow), , t2 vector of evi time series:

    (i in 2:(length(t2)-1)){           if (c2[i]==2 | c2[i]==4)           t2[i]<-mean(c(t2[i-1], t2[i+1]))} 

but not possible using calc function of raster package, because not works functions 2 parameters.

any suggestion how deal , apply interpolation pixels of raster time series?

i´m trying this, still not working:

for (i in 2:(length(stacklist)-1)){  re<-raster(stacklist[i])  re1<-raster(stacklist[i+1])  re0<-raster(stacklist[i-1])  rc<-raster(stacklist2[i])  if (rc[i]==2 | rc[i]==4) re[i]<-mean(c(re0[i],re1[i]))  writeraster(re,filename =paste0(substr(stacklist[i], 48, 59),"_filtered.tif"))}   

i believe following meet needs. i'm assuming:

  1. each image in time raster. these placed in rasterstack named t2.stack ordered in increasing time. image @ i-th time period in stack referenced t2.stack[[i]].
  2. for each image in time there fmask. allows different fmasks different times (although can same). these placed in rasterstack named c2.stack. these correspondingly ordered in time t2.stack. fmask @ i-th time period in stack referenced c2.stack[[i]].
  3. all rasters (both images , fmasks) of same size (same number of rows, columns, , therefore, pixels).

we first simulate data illustrate:

library(raster) set.seed(42)     ## repeatable results  ## simulate stacks of rasters on time period [1,nt=3], yours longer ## 1. each raster 10 x 10, yours larger ## 2. each c2 raster contains integers uniformly distributed in [0, 5] ## 3. each t2 raster contains reals unformly distributed in [0,1] ## 4. c2.stack stack of c2 rasters on time period, c2.raster[[i]] c2 @ time ## 5. t2.stack stack of t2 rasters on time period, t2.raster[[i]] t2 @ time nt <- 3 c2 <- raster(ncol=10, nrow=10)                   c2[] <- floor(runif(ncell(c2), min=1, max=6))    c2.stack <- stack(x=c2) (i in 2:nt) {   c2[] <- floor(runif(ncell(c2), min=1, max=6))   c2.stack <- addlayer(c2.stack, c2) }  t2 <- raster(ncol=10, nrow=10) t2[] <- runif(ncell(t2), min=0, max=1) t2.stack <- stack(x=t2) (i in 2:nt) {   t2[] <- runif(ncell(t2), min=0, max=1)   t2.stack <- addlayer(t2.stack, t2) }  ## here t2.stack data print(head(t2.stack[[1]])) ##            1           2          3          4          5          6          7         8          9         10 ##1  0.48376814 0.444569528 0.06038559 0.32750602 0.87842905 0.93060489 0.39217846 0.1588468 0.31994760 0.30696562 ##2  0.10781125 0.979334303 0.49690343 0.09307467 0.21177366 0.93050075 0.29684641 0.6532182 0.90107048 0.99079579 ##3  0.43033322 0.393776922 0.14190890 0.27980670 0.56482222 0.93513951 0.35840015 0.8420072 0.72240921 0.75073599 ##4  0.92398845 0.002378107 0.16042991 0.39927295 0.67531958 0.48037202 0.53382878 0.3169502 0.81475759 0.29221952 ##5  0.40913209 0.090918308 0.79859664 0.35978525 0.04048758 0.04108634 0.95443424 0.3733412 0.80641967 0.91005901 ##6  0.44007621 0.576336503 0.07366780 0.16462739 0.73989078 0.47571101 0.68552095 0.9515149 0.49746449 0.47050063 ##7  0.56019195 0.652510121 0.27957350 0.97990759 0.64386411 0.58257844 0.61587103 0.9251403 0.39002290 0.28791969 ##8  0.09073596 0.322033904 0.75827011 0.10441293 0.71027785 0.96647738 0.20149123 0.1084887 0.05540218 0.82972352 ##9  0.58119776 0.470092375 0.36501412 0.28012463 0.59971585 0.81856961 0.09783228 0.9636895 0.16873644 0.08608341 ##10 0.86121070 0.524790602 0.65681088 0.22951937 0.72122603 0.49075039 0.96525559 0.9069425 0.55125053 0.07559910  print(head(t2.stack[[2]])) ##        1           2         3          4         5          6         7         8          9         10 ##1  0.02270001 0.513239528 0.6307262 0.41877162 0.8792659 0.10798707 0.9802787 0.2649666 0.08427752 0.38590718 ##2  0.12489583 0.581554222 0.2401496 0.72188789 0.1459287 0.15283877 0.2592227 0.7778863 0.42646630 0.06004834 ##3  0.11483254 0.482756897 0.9791736 0.81151679 0.5429128 0.07236709 0.4664852 0.3399056 0.68991861 0.51415737 ##4  0.51492302 0.545514354 0.4474573 0.08388484 0.9301337 0.01644819 0.4140924 0.2269761 0.09964059 0.48292388 ##5  0.65012867 0.921329778 0.3626018 0.85513499 0.3009062 0.46566243 0.1427307 0.8077190 0.66580763 0.06194098 ##6  0.43092557 0.396855081 0.6969568 0.65931965 0.4073507 0.30692022 0.2551073 0.6725682 0.89439343 0.84573616 ##7  0.39290186 0.079050540 0.8284231 0.07289182 0.1147627 0.63998427 0.3205662 0.1887495 0.39382964 0.86202602 ##8  0.34791141 0.001433898 0.9112845 0.95172345 0.4909190 0.46365172 0.5964720 0.9060510 0.17300118 0.78588108 ##9  0.23293438 0.577048209 0.8408770 0.13220378 0.8958912 0.45013734 0.8941425 0.2485452 0.08369529 0.04864107 ##10 0.97981587 0.484167741 0.8453930 0.41629360 0.4893425 0.18328782 0.7591615 0.3051433 0.16567825 0.03280914  print(head(t2.stack[[3]])) ##           1         2          3            4         5          6           7          8         9        10 ##1  0.1365052 0.1771364 0.51956045 0.8111207851 0.1153620 0.89342179 0.575352881 0.14657239 0.9028058 0.2530025 ##2  0.1505976 0.7685472 0.23012333 0.3053993280 0.5185696 0.33459967 0.154434968 0.26636957 0.3507546 0.5784584 ##3  0.8086018 0.9332703 0.83386334 0.1270027745 0.6494540 0.69035166 0.032044824 0.92048915 0.4784689 0.2665206 ##4  0.8565107 0.2291465 0.79194687 0.6467748603 0.4243347 0.09506827 0.003467704 0.53113367 0.5243071 0.2131856 ##5  0.7169321 0.9613436 0.51826660 0.1745280223 0.5625401 0.75925817 0.666971338 0.22487292 0.3458498 0.3198318 ##6  0.9048984 0.1991984 0.68096302 0.1375177586 0.1069947 0.09285940 0.916448955 0.27706044 0.8857939 0.7728646 ##7  0.7950512 0.2056736 0.04819332 0.0388159312 0.2845741 0.34880983 0.737453325 0.25166358 0.5174370 0.7594447 ##8  0.6360845 0.2039407 0.99304528 0.0004050434 0.2065700 0.63402809 0.017291825 0.02673547 0.6078406 0.5705414 ##9  0.2458533 0.9195251 0.67221620 0.6454504393 0.2082855 0.48061774 0.986518583 0.99311985 0.4507740 0.7148488 ##10 0.3165616 0.8336876 0.43397558 0.9959922582 0.8058112 0.48624217 0.538772001 0.34103991 0.0520156 0.4587231  ## , fmask product @ time 2 (c2.stack[[2]]) print(head(c2.stack[[2]])) ##   1 2 3 4 5 6 7 8 9 10 ##1  4 2 2 2 5 5 4 4 3  1 ##2  4 5 4 3 3 3 1 2 4  5 ##3  2 3 3 3 4 2 5 5 2  4 ##4  5 4 4 5 5 3 5 1 4  4 ##5  1 1 3 4 4 5 1 5 2  1 ##6  4 2 4 2 4 4 1 1 1  4 ##7  5 3 4 1 3 1 3 2 1  1 ##8  4 3 3 3 3 1 5 3 4  4 ##9  5 5 2 2 4 4 5 4 1  2 ##10 1 4 1 1 1 1 3 1 4  4  ## make copy of t2.stack can compare results using overlay later t3.stack <- t2.stack 

the key processing use masks in place of conditional statement. code follows:

for (i in 2:(nlayers(t2.stack)-1)) {    cloud.shadow.mask <- (c2.stack[[i]]==2 | c2.stack[[i]]==4)   the.mean <- mask((t2.stack[[i-1]] + t2.stack[[i+1]])/2, cloud.shadow.mask,             maskvalue=false, updatevalue=0.)   the.middle <- mask(t2.stack[[i]], cloud.shadow.mask,           maskvalue=true, updatevalue=0.)   t2.stack[[i]] <- the.mean + the.middle } 

notes:

  1. cloud.shadow.mask raster true when there cloud or shadow @ pixel , false otherwise.
  2. use mask on raster mean between t2.stack[[i-1]] , t2.stack[[i+1]] set pixels cloud.shadow.mask false zero.
  3. conversely, mask raster t2.stack[[i]] set pixels cloud.shadow.mask true zero.
  4. then add these 2 rasters update t2.stack[[i]].

here result nt=3 t2.stack[[2]] computed:

print(head(t2.stack[[2]])) ##           1           2         3          4         5          6         7         8          9         10 ##1  0.3101367 0.310852970 0.2899730 0.56931340 0.8792659 0.10798707 0.4837657 0.1527096 0.08427752 0.38590718 ##2  0.1292044 0.581554222 0.3635134 0.72188789 0.1459287 0.15283877 0.2592227 0.4597939 0.62591255 0.06004834 ##3  0.6194675 0.482756897 0.9791736 0.81151679 0.6071381 0.81274558 0.4664852 0.3399056 0.60043905 0.50862828 ##4  0.5149230 0.115762292 0.4761884 0.08388484 0.9301337 0.01644819 0.4140924 0.2269761 0.66953235 0.25270254 ##5  0.6501287 0.921329778 0.3626018 0.26715664 0.3015139 0.46566243 0.1427307 0.8077190 0.57613471 0.06194098 ##6  0.6724873 0.387767442 0.3773154 0.15107258 0.4234427 0.28428520 0.2551073 0.6725682 0.89439343 0.62168264 ##7  0.3929019 0.079050540 0.1638834 0.07289182 0.1147627 0.63998427 0.3205662 0.5884019 0.39382964 0.86202602 ##8  0.3634102 0.001433898 0.9112845 0.95172345 0.4909190 0.46365172 0.5964720 0.9060510 0.33162139 0.70013243 ##9  0.2329344 0.577048209 0.5186152 0.46278753 0.4040007 0.64959367 0.8941425 0.9784047 0.08369529 0.40046610 ##10 0.9798159 0.679239081 0.8453930 0.41629360 0.4893425 0.18328782 0.7591615 0.3051433 0.30163307 0.26716111 

for large images may not fit memory, use overlay instead of calc efficiency. here repeat computation using original t2.stack copied t3.stack

for (i in 2:(nlayers(t3.stack)-1)) {    cloud.shadow.mask <- overlay(c2.stack[[i]], fun = function(x) x == 2 | x == 4)   the.mean <- overlay(t3.stack[[i-1]], t3.stack[[i+1]], fun = function(x,y) (x+y)/2)   the.mean <- mask(the.mean, cloud.shadow.mask, maskvalue=false, updatevalue=0.)   the.middle <- mask(t3.stack[[i]], cloud.shadow.mask, maskvalue=true, updatevalue=0.)   t3.stack[[i]] <- overlay(the.mean, the.middle, fun=sum) } 

the results same.

print(all.equal(t2.stack[[2]],t3.stack[[2]])) ##[1] true 

Comments

Popular posts from this blog

Spring Boot + JPA + Hibernate: Unable to locate persister -

go - Golang: panic: runtime error: invalid memory address or nil pointer dereference using bufio.Scanner -

c - double free or corruption (fasttop) -