2017-06-06 39 views
3

在R中,我怎么能区分内部和外部NA的光栅与某种形状有NA的周围,但也在里面?区分内部和外部NA在一个光栅R

在下面的例子中,我怎么可能只选择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)") 

enter image description here

回答

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

+0

谢谢 - 我也认为'丛'是最好的方法。从技术上讲,所需的输出在这里是'rc_reclass = clump(is.na(r))',然后是'rc_reclass [rc_reclass> 1] = NA'来选择外部的'NA',但是因此你提供了一个合适的解决方案。谢谢! – ztl

2

我@马丁同意,这是一个有点棘手。您不仅没有专用的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等,但无济于事。

相关问题