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.
希望这是有道理的。
非常感谢
可以通过将函数传递给 focal
的 fun
参数来实现。
像这样传递的函数应该对数字向量进行操作。如果您使用 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))
我想过滤大栅格,但只有 运行 如果 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.
希望这是有道理的。 非常感谢
可以通过将函数传递给 focal
的 fun
参数来实现。
像这样传递的函数应该对数字向量进行操作。如果您使用 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))