在R中的栅格中区分内部NA和外部NA

时间:2017-06-06 14:54:12

标签: r r-raster no-data

在R中,我怎样才能区分出内部NA的内部NA在一个具有NA的形状的光栅内部,但也在内部?

在下面的示例中,我如何仅选择R徽标外的library(raster) r <- raster(system.file("external/rlogo.grd", package="raster")) r[r>240] = NA par(mfrow=c(1,2)) plot(r, main='r') plot(is.na(r), main="is.na(r)") (即,如何将徽标圈中包含的所有内容显示为白色)?< / p>

'doc_fullnumber' => 'unique:tourists,custom_fullnumber_field'

enter image description here

2 个答案:

答案 0 :(得分:2)

你真的没有多少选择。这种类型的分析通常需要一些更复杂的方法。然而,这是一个使用clump函数的简单解决方法:

#your inital code
library(raster)
r <- raster(system.file("external/rlogo.grd", package="raster"))
rna <- rc <- r
rna[r>240] = NA
par(mfrow=c(2,2))

#reclass values <=240 to NA (needed for clump function. 
#Here, NAs are used to seperate clumps)
rc[r<=240] <- NA
rc <- clump(rc)

#what you get after applying the clump function
#are homogenous areas that are separated by NAs. 
#Let's reclassify all areas with an ID > 8. 
#In this case, these are the areas inside the ring.
rc_reclass <- rc
rc_reclass[rc_reclass>8]  <- 100

#let's do some plotting
plot(r, main='r')
plot(is.na(rna), main="is.na(r)")
plot(rc, main="clumps")
plot(rc_reclass, main="clumps reclass")

enter image description here

答案 1 :(得分:2)

我同意@maRtin,这有点棘手。不仅没有专用的NoData值,而且图像也有点脏污。

尽管如此,我认为我发现了一种比clump更好的方法,它使用空间域来区分区域:

首先,我获得像素邻域的焦点值:

#make copy
r2 <- r

# focal values
fv <- getValuesFocal(r2,ngb = c(3,3))

然后我首先排除所有像素,其邻域值大于242.8。这纯粹是反复试验,但它给出了一个好结果。

ix <- rowMeans(fv,na.rm = T) > 242.8
r2[ix] <- NA

你实际上可以认为这是可以接受的。唯一的问题是,值区域周围有一个小边框,应该是NA。

enter image description here

所以不知怎的,我需要摆脱剩余的NA像素。我尝试使用迭代排除。对于每次迭代,我看到是否有像素仍然具有NA值,并且最大值低于某个阈值。再说一次,我参与了很多游戏,我想你可以取得比这更好的结果,但我想这是一种可行的方式。

while (TRUE){

  fv <- getValuesFocal(r2,ngb = c(3,3))
  ix <- apply(fv,1,function(x) max(x,na.rm=T)) > 243 & rowSums(is.na(fv)) > 0

  if (any(ix)){

    r2[ix] <- NA


  } else {
    break
  }
}

经过几次迭代后,我明白了:

enter image description here

显然已经有一些像素不复存在了,也许可以通过更多的摆弄来完成。

另一个有趣的想法是关注所有三个频道。如果使用brick加载图像,则可以获取RGB通道。我尝试了一些像max,mean,mode,sd等的东西,但无济于事。