2017-06-06 83 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等,但無濟於事。

相關問題