如何在二进制栅格中提取每个目标的边界框?
问题:为二进制栅格中的目标生成边界框
我有一个由目标(值为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
相关产品推荐
相关产品推荐

