求可将SF/WKT多边形转为同维度掩码矩阵的R函数
生成SLIC分割结果的掩码矩阵
我有一个以矩阵存储的灰度图像,使用SLIC算法将其分割为若干区域后,得到包含多边形的Simple Feature(sf)对象(也可提取为Well-Known-Text(WKT)格式)。需要生成一个与原图像矩阵维度一致的掩码矩阵/数组,其中每个像素位置存储该像素所属的多边形ID。例如,若像素image[1,2]属于多边形5,则mask[1,2] <- 5。
用户提供的示例代码(基于随机“图像”):
mat <- array(runif(10000, min=0, max=500), dim=c(100,100)) # SLIC library(supercells); library(sf); library(terra); # 矩阵转空间栅格 raster <- rast(mat); rasterSLIC <- supercells(raster, k = 50, compactness = 1, dist_fun = "euclidean", avg_fun = "mean"); plot(raster); plot(st_geometry(rasterSLIC), add = TRUE, lwd = 0.2); point <- st_cast(rasterSLIC$geometry[2], to="POINT"); coord <- st_coordinates(point); # 目标效果示例: goal <- array(c(1,1,1,2,2,1,2,3,3), dim=c(3,3)); image(goal); goal;
解决方案
直接利用terra包的rasterize函数,将SLIC得到的sf多边形对象栅格化,即可生成与原图像维度一致的掩码矩阵:
# 生成随机灰度图像矩阵 mat <- array(runif(10000, min=0, max=500), dim=c(100,100)) # 加载所需包 library(supercells); library(sf); library(terra); # 矩阵转栅格对象 raster <- rast(mat); # 执行SLIC超像素分割 rasterSLIC <- supercells(raster, k = 50, compactness = 1, dist_fun = "euclidean", avg_fun = "mean"); # 核心步骤:将sf多边形栅格化,用supercell_id作为像素值 mask_raster <- rasterize(rasterSLIC, raster, field = "supercell_id") # 将栅格转换为数组,维度与原图像矩阵完全一致 mask_matrix <- as.array(mask_raster) # 查看结果 image(mask_matrix) head(mask_matrix)
说明
rasterize函数会自动匹配原栅格raster的分辨率和维度,将每个多边形覆盖的所有像素赋值为对应的supercell_idas.array将栅格对象转换为数组后,其维度、行列顺序与原图像矩阵mat完全一致,满足需求
内容的提问来源于stack exchange,提问作者Allerleirauh
相关产品推荐
相关产品推荐

