R focal (raster)- 条件过滤器(仅 运行 如果 window 中心为值 1)

R focal (raster)- conditional filter (only run if window center is value 1)

我想过滤大栅格,但只有 运行 如果 window 的中心像元是特定值,才过滤。本质上,我想从图像(0 或 1 的像素)中去除一些斑点(误报),但如果 window 中心为 1,则仅 运行 过滤器。

# create some raster data
library(raster)
r <- raster(ncols=12, nrows=12)
set.seed(0)
r[] <- round(runif(ncell(r))*0.7 )
plot(r)

# custom filter
w=matrix(1,5,5)
gameOfLife <- function(x) {
f <- focal(x, w=w, pad=TRUE, padValue=0)
#  window with with less than 5 cells die
x[f < 5] <- 0
# window with 5 or more cells live
x[f >= 5] <- 1
x
}

plot(gameOfLife(r))

上面的 2 个带圆圈的单元格符合条件(它们周围至少有 5 个值为 1)但最初为 0,我希望它们保持为 0。因此,过滤器仅适用于中心值已经是 1.

希望这是有道理的。 非常感谢

可以通过将函数传递给 focalfun 参数来实现。 像这样传递的函数应该对数字向量进行操作。如果您使用 5x5 权重矩阵,中心单元格将是该数值向量的第 13 个元素。您可以使用此信息来检查您的中心单元格是否在开始时为 0 并且有条件地 return 值。

r[sample(1:ncell(r), 30)] <- NA # add NA values to example raster

gol_fun <- function(x) {

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

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

  ncells <- sum(x, na.rm=TRUE)

  if (ncells<5) { #  window with with less than 5 cells die
    return(0)
  } else if (ncells >= 5) { # window with 5 or more cells live
    return(1)
  }
}




gameOfLife <- function(x) {
  f <- focal(x, w=w, fun=gol_fun, pad=TRUE, padValue=0)
}


plot(r)
plot(gameOfLife(r))