Как найти ограничивающие рамки объектов в растре? - PullRequest
0 голосов
/ 09 мая 2020

У меня есть двоичный растр, состоящий из объектов (1) и фона (0). Как найти ограничивающие рамки объектов? У каждого объекта должен быть свой собственный бокс.

Ввод:

library("raster")

mat = matrix(
  c(0, 0, 0, 0, 0, 0,
    0, 1, 1, 1, 0, 0,
    0, 0, 1, 1, 1, 0,
    0, 0, 0, 0, 0, 0,
    0, 0, 1, 1, 0, 0,
    0, 1, 1, 1, 1, 0,
    0, 0, 1, 1, 0, 0,
    0, 0, 0, 0, 0, 0), 
  ncol = 6, nrow = 8, byrow = TRUE
  )

ras = raster(mat)

Я ожидаю такой результат:

result = raster(matrix(
  c(0, 0, 0, 0, 0, 0,
    0, 1, 1, 1, 1, 0,
    0, 1, 1, 1, 1, 0,
    0, 0, 0, 0, 0, 0,
    0, 1, 1, 1, 1, 0,
    0, 1, 0, 0, 1, 0,
    0, 1, 1, 1, 1, 0,
    0, 0, 0, 0, 0, 0), 
  ncol = 6, nrow = 8, byrow = TRUE
))

1 Ответ

2 голосов
/ 09 мая 2020

Здесь в подходе

Пример данных

library(raster)
mat = matrix(
  c(0, 0, 0, 0, 0, 0,
    0, 1, 1, 1, 0, 0,
    0, 0, 1, 1, 1, 0,
    0, 0, 0, 0, 0, 0,
    0, 0, 1, 1, 0, 0,
    0, 1, 1, 1, 1, 0,
    0, 0, 1, 1, 0, 0,
    0, 0, 0, 0, 0, 0), 
  ncol = 6, nrow = 8, byrow = TRUE )

ras <- raster(mat)

Решение

f <- function(r) {
    x <- reclassify(ras, cbind(0,NA))
    y <- rasterToPolygons(x, dissolve=TRUE)
    z <- disaggregate(y)    
    e <- sapply(1:length(z), function(i) extent(z[i,]))
    p <- spPolygons(e)
    r <- rasterize(p, r)
    d <- boundaries(r)
    reclassify(d, cbind(NA, 0))
}

r <- f(res)

as.matrix(r)
#     [,1] [,2] [,3] [,4] [,5] [,6]
#[1,]    0    0    0    0    0    0
#[2,]    0    1    1    1    1    0
#[3,]    0    1    1    1    1    0
#[4,]    0    0    0    0    0    0
#[5,]    0    1    1    1    1    0
#[6,]    0    1    0    0    1    0
#[7,]    0    1    1    1    1    0
#[8,]    0    0    0    0    0    0

Конечно, возможно, что ограничивающие рамки объектов перекрываются, в чем Полагаю, решения нет.

...