You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在二进制栅格中提取每个目标的边界框?

问题:为二进制栅格中的目标生成边界框

我有一个由目标(值为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, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 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. 标记连通的目标区域

首先用clump()函数把栅格里连在一起的1区域(目标)标记出来,每个连通区域会被分配一个唯一的ID。这里用directions = 8表示8邻域连通(上下左右+四个对角线都算连通),如果你的需求是4邻域(仅上下左右),把参数改成4就行。

library("raster")

# 标记连通区域
clumped <- clump(ras, directions = 8)

2. 为每个区域绘制边界框

接下来遍历每个标记好的区域,计算它的边界框范围,然后把边界框的四条边对应的单元格设为1:

# 创建一个和原栅格尺寸一致的空结果栅格,初始值全为0
result_ras <- raster(nrow = nrow(ras), ncol = ncol(ras), vals = 0)

# 获取所有目标区域的ID(去掉NA,因为NA对应背景的0区域)
region_ids <- unique(values(clumped))
region_ids <- region_ids[!is.na(region_ids)]

# 逐个处理每个目标区域
for (id in region_ids) {
  # 获取当前区域所有单元格的坐标
  target_cells <- which(values(clumped) == id)
  target_coords <- xyFromCell(clumped, target_cells)
  
  # 计算边界框的范围:最小/最大列(x轴)和最小/最大行(y轴)
  min_col <- min(target_coords[, 1])
  max_col <- max(target_coords[, 1])
  min_row <- min(target_coords[, 2])
  max_row <- max(target_coords[, 2])
  
  # 绘制边界框的四条边:上边、下边、左边、右边
  result_ras[min_row, min_col:max_col] <- 1
  result_ras[max_row, min_col:max_col] <- 1
  result_ras[min_row:max_row, min_col] <- 1
  result_ras[min_row:max_row, max_col] <- 1
}

3. 验证结果

现在你可以把结果栅格转换成矩阵,和你预期的输出对比:

# 查看生成的结果矩阵
as.matrix(result_ras)

运行完这段代码,生成的栅格就和你给出的result完全一致啦!


内容的提问来源于stack exchange,提问作者lodomi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 16:12:48