R focal(光栅包):如何将滤镜应用于背景数据的子集?

时间:2015-01-12 16:05:43

标签: r optimization r-raster

我想知道你是否有人可以帮我处理R栅格包中的focal()函数的以下任务。

默认情况下,focal()函数将遍历给定栅格的每个像元(以后的背景光栅),并将给定函数应用于由用户定义的移动窗口定义的相邻值。为了优化和加快我对大型栅格/研究区域的计算,我想仅在“背景”背景下应用此功能(过滤器)。栅格在“移动窗口”覆盖的范围内具有一些值(例如大于零)。并跳过所有其他焦点单元格。这样,过滤器就不会花费时间计算任何不需要的焦点值。

下面是一个可重现的小例子和内联评论:

library(raster)

x <- matrix(1:25, ncol=5)
x[c(1,2,3,6,7,8,11,12,13)] <- 0
r <- raster(x)

#Apply filter to focal cells and return values using a 3x3 moving window...ONLY IF 
#ALL values found within the window are > 0. Skip focal cell otherwise.

r3 <- focal(r, w=matrix(1/9,nrow=3,ncol=3), FUN=sum)

我应该如何更改此功能以获得所需的结果?

2 个答案:

答案 0 :(得分:1)

窗口滑动操作@所有焦点像素位置。跳过/跳跃位置是不可能的。但是,您可以检查所有元素/矩阵单元是否满足阈值条件,如下所示:

myfunc = function (x){
  if(all(x > threshold)){
    print(x)
    x = sum(x)
  }else{
    x = 0}
}
r3 <- focal(x=r>1, w=matrix(1/9,nrow=3,ncol=3), fun=sum)

答案 1 :(得分:0)

我不确定它会更快,但您也可以检查中心细胞是否符合某些标准(例如,NA或> 0)。这样,焦点计算只有在满足这些标准时才会运行。

w=matrix(1,5,5)

skipNA_avgFunc <- function(x) {

  # general definition of center cell for weight matrices with odd dims
  center <- x[ceiling(length(x)/2)]

  if (is.na(center)) { # handle NA values
    return(center)
  }

  else if (center >= 0) { # calculate mean
    mean(x, na.rm=TRUE)
  }
}
r3 <- focal(r, w=w, fun=skipNA_avgFunc, pad=TRUE, padValue=NA)