R过滤光栅使用带有阈值的focal() - 定义正确的功能

时间:2014-11-21 10:16:50

标签: r filter raster threshold

我有为我的任务定义正确功能的问题。为了过滤图像,我已经设置了一个带有

的过滤矩阵eucdis
library(rgdal)
library(raster)
refm=matrix(1,nrow=11,ncol=11)
M = dim(refm)[1]

N = dim(refm)[2]

eucdis = matrix(NaN, nrow=11, ncol=11)
for (i in -5:5){
      for (j in -5:5){
            eucdis[i+6,j+6] = 2*(sqrt(sum(abs(0-i)^2+abs(0-j)^2))) #euclidean distance of the moving matrix
            eucdis[6,6]=1
            eucdis[eucdis>10]=0
            eucdis[eucdis>0]=1
      }
}

使用示例栅格

f <- system.file("external/test.grd", package="raster")
f
r <- raster(f)

我想过滤具有特定值的栅格的所有值,例如在移动的eucdis滤波器矩阵的10%(= 8)内的200

s=focal(x=r,w=eucdis,fun=function(w) {if (length(w[w==1])>=8) {s=1} else {s=0}})

但这只给了我所有的值,其中eucdis滤波器矩阵至少有8个像素,任何r值。如果我添加关于r[r>=200]的约束,它就不会像我想象的那样工作。它没有考虑第二个约束。

s=focal(x=r,w=eucdis,fun=function(w,x) {
           if (length(w[w==1])>=8 | x[x>=200]){s=1} else {s=0}}) 
# I also tried & and &&

如果有人可以帮助我。我已经度过了几天,无法理解我的自我。

谢谢,

1 个答案:

答案 0 :(得分:1)

传递给focal的函数并不是指权重矩阵。相反,它指的是落在移动窗口内的r的单元格(并且这些单元格对函数的返回值的相对贡献由权重矩阵控制)。因此,在您使用function(w) {if (length(w[w==1])>=8) 1 else 0}的情况下,如果r的焦点子集至少有8个值等于1的单元格,则实际上您要返回1(否则返回0) )。

实现目标的一个目标是对已经过阈值处理的二进制栅格执行焦点求和。您将应用于移动窗口的函数为sum,并且此焦点的输出为将指示阈值栅格中具有值1的单元格数(这对应于在移动窗口内具有值> = 200的r的单元格数)。

library(raster)
r <- raster(system.file("external/test.grd", package="raster"))

m <- matrix(2 * pointDistance(expand.grid(-5:5, -5:5), c(0, 0), lonlat=FALSE),
            ncol=11, nrow=11)
m <- m <= 10

r2 <- focal(r >= 200, m, sum, na.rm=TRUE, pad=TRUE)
plot(r2)

enter image description here

然后,您可以检查该栅格的哪些单元格的值> gt =。

r3 <- r2 >= 8
plot(r3)

enter image description here

在这种情况下,几乎所有细胞都符合您的标准。