高效R栅格代数

时间:2018-11-02 18:51:31

标签: r r-raster

为了计算多光谱辐射图像的反射率 用线性扫描仪采集的图像,我有一个白色参考值的1行数组: 多光谱图像A:x行,y cols,z波段 多光谱参考图像B:1行,y cols,z波段

在简单的数组形式的R代码中,我们可以设置以下示例:

a <- array(runif(3*5*6),dim=c(3,5,6)) 
b <- matrix(runif(5*6),nrow=5)

在此示例中,我将重复b的每一行以使 数组作为a,然后计算a / b,为此:

b2 <- rep(b,nrow(a))
dim(b2) <- c(ncol(a),dim(a)[3],nrow(a))
b3 <- aperm(b2,c(3,1,2))
res <- a/b3

或使用循环:

res <- a
for(i in 1:nrow(a)){
  res[i,,] <- a[i,,]/b
}

现在实际图像相对较大,x = 969,y = 640,z = 224 并想知道是否有一种相对有效的方法 使用包栅格。我尝试过的速度很慢:

* a和b从envi文件中读取为光栅砖
*我如上所述计算b3
*我将b3转换为光栅块,但是它非常慢并且接近内存问题:

x=969; y=640; z=224
b <- matrix(runif(y*z),nrow=y)
b2 <- rep(b,x)
dim(b2) <- c(y,z,x)
b3 <- aperm(b2,c(3,1,2))
b4 <- brick(b3)
extent(b4) <- c(0,y,0,x)
b4
writeRaster(b4,"b4",overwrite=TRUE)
rm(b2,b3,b4)
b4 <- brick("b4.gri")
b4
res <- overlay(x=RadIma,y=b4,fun=function(x,y){x/y}, filename="res",overwrite=TRUE)

可能有一种直接与b运算的方式,从而避免了b2,b3和b4 ...

1 个答案:

答案 0 :(得分:0)

我已经尝试过merge(),但是虽然它适用于可重现的示例,但在实际情况下实在太慢了:

a <- array(runif(3*5*6),dim=c(3,5,6)) 
b <- matrix(runif(5*6),nrow=5)
dim(b) <- c(1,dim(a)[2:3])

a <- brick(a)
extent(a) <- c(0,ncol(a),0,nrow(a))
res(a) <- 1
b <- brick(b)
extent(b) <- c(0,dim(b)[2],0,1)
res(b) <- 1
a
b

v <- vector(length=nrow(a),mode="list")
v[1:nrow(a)] <- list(b)
for(i in 1:nrow(a)) extent(v[[i]]) <- c(0,ncol(a),i-1,i)
b4 <- do.call(merge,args=c(v,filename="b4",format="GTiff",overwrite=TRUE))
b4
dim(a)
dim(b4)
res <- overlay(x=a,y=b4,fun=function(x,y){x/y}, filename="res",overwrite=TRUE)

因此,这并不是真正的解决方案。