【问题标题】:R focal (raster)- conditional filter (only run if window center is value 1)R 焦点(光栅)- 条件过滤器(仅在窗口中心值为 1 时运行)
【发布时间】:2017-01-09 17:56:43
【问题描述】:

我想过滤一个大栅格,但只有在窗口的中心单元格是特定值时才运行过滤器。本质上,我想从图像(0 或 1 的像素)中去除一些斑点(误报),但只有在窗口中心为 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.

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

【问题讨论】:

    标签: r filtering raster


    【解决方案1】:

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

    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))
    

    【讨论】:

    • 非常感谢乔布林!最后一个Q,如果你愿意的话。我的栅格显然比示例场景复杂一些,并且具有破坏功能的 NA。我一直在尝试自己(未成功)调整您的代码以通过 NA 工作,但遇到了麻烦。 r[12,8]
    • 评论超时我尝试在初始 if 子句之后添加额外的 if else 以跳过 if NA 。 Def 感觉很厚 b/c 我无法解决这个问题......
    • 我已经编辑了我的答案,因此该函数现在包括处理 NA 值并将 NA 值添加到示例栅格中。
    猜你喜欢
    • 2014-07-26
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 2014-01-07
    相关资源
    最近更新 更多