我@马丁同意,这是一个有点棘手。您不仅没有专用的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。
所以不知何故,我需要摆脱剩余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
}
}
几次迭代后,我得到这个:
显然有一些已经消失的像素不应该是,也许它可以用多一点摆弄周围做。
另一个有趣的想法是看所有三个渠道。如果您使用brick
加载图像,则可以获取RGB通道。我已经尝试了一些像max,mean,mode,sd等,但无济于事。
来源
2017-06-06 18:55:35
Val
谢谢 - 我也认为'丛'是最好的方法。从技术上讲,所需的输出在这里是'rc_reclass = clump(is.na(r))',然后是'rc_reclass [rc_reclass> 1] = NA'来选择外部的'NA',但是因此你提供了一个合适的解决方案。谢谢! – ztl