我同意@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。
所以我需要以某种方式摆脱剩余的 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 等,但无济于事。