为了计算用线性扫描仪获取的多光谱辐射图像的反射率,我有一个1行的白色参考值阵列:多光谱图像A: x行,y列,z波段多光谱参考图像B: 1行,y列,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...
发布于 2018-11-06 16:48:53
我曾尝试使用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)
因此,这不是一个真正的解决方案。
https://stackoverflow.com/questions/53124316
复制相似问题