R:使用光栅包的函数错误

时间:2015-04-04 17:33:49

标签: r image r-raster

我有光栅图像,我想应用一个函数,该函数将根据相邻单元格值给出一个值。在该单元格中心的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&lt; -focal(r,w = matrix(1,3,3),fun = mix(w))

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

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

任何帮助将不胜感激。

先谢谢 约翰

3 个答案:

答案 0 :(得分:1)

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

mix2 <- function(a, ...){
   i <- a[5] != a
   mean(i[-5], na.rm=TRUE)
}

答案 1 :(得分: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的光栅并且工作正常

我将其标记为已回答。

度过愉快的一天

答案 2 :(得分: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)
}
相关问题