0

我有光栅图像,我想应用一个函数,该函数将根据相邻单元格的值给出一个值。在以该单元格为中心的 3x3 窗口中,我想给一个单元格一个介于 0 和 8/8(=1)之间的值,具体取决于多少个单元格(来自该窗口中的其他 8 个单元格)。例如,如果其他 5 个单元格的值与中心单元格不同,则函数必须在该单元格中分配 5/8。我正在尝试使用光栅包中的焦点来做到这一点。

首先,我编写了一个处理 3x3 窗口的函数:

    mix<-function(a, na.rm=TRUE){
  v==0
  b=a[2:2]
  if (!(a[1:1]=b)) {
    if (!is.na(a[1:1])){v=v+1}else v=v
  }
   if(!(a[1:2]=b)){if (!is.na(a[1:2])){v=v+1}else v=v}
    if(!(a[1:3]=b)){if (!is.na(a[1:3])){v=v+1}else v=v}
     if(!(a[2:1]=b)){if (!is.na(a[2:1])){v=v+1}else v=v}
      if(!(a[2:3]=b)){if (!is.na(a[2:3])){v=v+1}else v=v}
       if(!(a[3:1]=b)){if (!is.na(a[3:1])){v=v+1}else v=v}
        if(!(a[3:2]=b)){if (!is.na(a[3:2])){v=v+1}else v=v}
         if(!(a[3:1]=b)){if (!is.na(a[3:3])){v=v+1}else v=v}
  v
}

然后我尝试像这样使用焦点:

r2<-focal(r, w=matrix(1,3,3), fun=mix(w))

但是:“混合错误(w):找不到对象'v'”

我认为我遗漏了一些东西,也许方法不正确。

任何帮助将不胜感激。

提前谢谢约翰

4

3 回答 3

1

这是一个糟糕的功能,难以阅读且效率低下。Bergant 展示了一个更好的选择,这是另一个变体。

mix2 <- function(a, ...){
   i <- a[5] != a
   mean(i[-5], na.rm=TRUE)
}
于 2015-04-06T15:54:38.937 回答
0

我终于解决了我的问题我纠正了这样的混合功能:

mix<-function(a, na.rm=TRUE){
  v<-0
  b=a[5]
  if (!(a[1]==b)) {if (!(a[1]==0)){v=v+1}else v=v}
   if(!(a[2]==b)){if (!(a[2]==0)){v=v+1}else v=v}
    if(!(a[3]==b)){if (!(a[3]==0)){v=v+1}else v=v}
     if(!(a[4]==b)){if (!(a[4])==0){v=v+1}else v=v}
      if(!(a[6]==b)){if (!(a[6])==0){v=v+1}else v=v}
       if(!(a[7]==b)){if (!(a[7])==0){v=v+1}else v=v}
        if(!(a[8]==b)){if (!(a[8])==0){v=v+1}else v=v}
         if(!(a[9]==b)){if (!(a[9])==0){v=v+1}else v=v}         
  v/8
}

现在混合功能工作正常。用焦点做例子似乎焦点使用了应用窗口中的数字向量。所以它应该可以正常工作。我还在一个组成的 10x10 栅格中进行了测试,并且工作正常

我将其标记为已回答。

祝你今天过得愉快

于 2015-04-05T06:53:46.203 回答
0

在 R 中,您可以对向量执行基本操作:

mix2<-function(a, na.rm = TRUE){
  b <- a[5]
  a <- a[-5]
  mean(ifelse(a != b & a != 0, 1, 0), na.rm = na.rm)
}
于 2015-04-06T12:06:55.133 回答