2017-01-09 8 views
0

大きなラスタをフィルタリングしたいが、ウィンドウの中央のセルが特定の値であればフィルタを実行する。本質的に、私は、画像から一部のスペックル(偽陽性)を削除したい(0の画素または1)が、窓の中心は1Rフォーカル(ラスタ) - 条件付きフィルタ(ウィンドウ中心が値1の場合のみ実行)

# create some raster data 
library(raster) 
r <- raster(ncols=12, nrows=12) 
set.seed(0) 
r[] <- round(runif(ncell(r))*0.7) 
plot(r) 

enter image description here

# custom filter 
w=matrix(1,5,5) 
gameOfLife <- function(x) { 
f <- focal(x, w=w, pad=TRUE, padValue=0) 
# window with with less than 5 cells die 
x[f < 5] <- 0 
# window with 5 or more cells live 
x[f >= 5] <- 1 
x 
} 

plot(gameOfLife(r)) 

場合にのみフィルタを実行しますenter image description here

上記の円で囲まれた2つのセルは、基準を満たしています(周囲に少なくとも5つの値があります)が、最初は0でしたが、0にしておきたいと思います。既に1です。

希望は意味があります。 事前に感謝します

答えて

1

fun引数に関数を渡すことにより、focalが可能です。 数値ベクトルで動作するような関数が渡されました。 5×5の重み行列を使用する場合、中央のセルはその数値ベクトルの13番目の要素になります。この情報を使用して、最初にセンターセルが0であるかどうかをチェックし、条件付きで値を返すことができます。

r[sample(1:ncell(r), 30)] <- NA # add NA values to example raster 

gol_fun <- function(x) { 

    # more general definition of center cell for weight matrices with odd side size 
    center <- x[ceiling(length(x)/2)] 

    if (center==0 | is.na(center)) { # handle NA values 
    return(center) 
    } 

    ncells <- sum(x, na.rm=TRUE) 

    if (ncells<5) { # window with with less than 5 cells die 
    return(0) 
    } else if (ncells >= 5) { # window with 5 or more cells live 
    return(1) 
    } 
} 




gameOfLife <- function(x) { 
    f <- focal(x, w=w, fun=gol_fun, pad=TRUE, padValue=0) 
} 


plot(r) 
plot(gameOfLife(r)) 
+0

多くのおかげでjoberlin!あなたがそれをしているなら、最後の1つのQ。 私のラスタは、明らかに、例のシナリオよりも少し複雑で、機能を破るNAsを持っています。私は自分自身で(不成功に終わって)、あなたのコードを微調整して、NAを使って作業していましたが、問題を抱えていました。 r [12,8] < - NA – ThrushJacket

+0

タイムアウトしました 最初のif節の後に余分なものを追加して、NAをスキップしてみました。 太いb/cを感じるような感じです。私はこの1ビットを修正できません... – ThrushJacket

+0

私の答えを編集して、機能にNA値の処理が含まれ、NA値をサンプルラスタに追加するようにしました。 – joberlin