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:
- each image in time raster. these placed in
rasterstack
namedt2.stack
ordered in increasing time. image @i
-th time period in stack referencedt2.stack[[i]]
. - for each image in time there fmask. allows different fmasks different times (although can same). these placed in
rasterstack
namedc2.stack
. these correspondingly ordered in timet2.stack
. fmask @i
-th time period in stack referencedc2.stack[[i]]
. - 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:
cloud.shadow.mask
rastertrue
when there cloud or shadow @ pixel , false otherwise.- use
mask
on raster mean betweent2.stack[[i-1]]
,t2.stack[[i+1]]
set pixelscloud.shadow.mask
false
zero. - conversely,
mask
rastert2.stack[[i]]
set pixelscloud.shadow.mask
true
zero. - 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
Post a Comment