如何在光栅中找到对象的边界框?

How to find bounding boxes of objects in raster?

我有一个由对象 (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
))

这里有一个办法

示例数据

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

物体的边界框当然有可能重叠,我想这是无解的。