2017-01-09 1 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 인수에 함수를 전달하여 가능합니다. 숫자 벡터에서 작동해야하는 것과 같은 함수가 전달되었습니다. 5x5 가중치 행렬을 사용하면 중앙 셀은 해당 숫자 벡터의 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

많은 감사합니다. 마지막 Q 한가지. 내 래스터는 분명히 예제 시나리오보다 조금 복잡하고 기능을 해치는 NAs가 있습니다. 나 자신의 (unsuccessfuly) NA를 통해 작동하지만 문제가 코드를 조정할려고 노력했습니다. r [12,8] <- NA – ThrushJacket

+0

시간 초과되었습니다. 초기 if 절 뒤에 추가로 추가하면 NA를 건너 뜁니다. 두꺼운 느낌의 b/c 디프 느낌 ... – ThrushJacket

+0

기능이 이제 NA 값 처리를 포함하고 예제 래스터에 NA 값을 추가하도록 내 대답을 편집했습니다. – joberlin

관련 문제