使用R计算栅格图像离散区域面积:无maptools的替代方案求助
解决栅格图像中离散真菌区域面积计算的替代方案
方案一:使用spatstat原生工具转换栅格为owin对象
无需依赖已下架的maptools,spatstat支持直接从二值矩阵转换为owin对象,后续可沿用你原有的分析流程:
library(spatstat) library(png) # 读取图像(JPG/BMP可改用jpeg/bmp包的对应函数) img <- readPNG("20231031_110019.png") # 彩色图转为灰度矩阵 gray_img <- rowMeans(img, dims = 2) # 二值化:根据图像明暗调整阈值,这里假设真菌区域灰度值更低 binary_mat <- gray_img < 0.5 # 直接将二值矩阵转为owin对象 my_owin <- as.owin(binary_mat) # 执行区域分析流程 dd <- dilation(my_owin, 0.5, polygonal = FALSE) P <- connected(dd) B <- tess(image = P) area_list <- tile.areas(B)
方案二:用raster包直接计算离散区域面积
raster包专注栅格数据处理,无需转换为owin,直接标记连通区域并统计面积:
library(raster) library(png) # 读取图像并转为灰度栅格 img <- readPNG("20231031_110019.png") gray_img <- rowMeans(img, dims = 2) r <- raster(gray_img) # 二值化分割真菌区域 r_binary <- r < 0.5 # 标记连通区域(directions=8表示8邻接,含对角线;可选4邻接) regions <- clump(r_binary, directions = 8) # 统计每个区域的像素数(若需实际面积,需乘以单像素对应物理面积) area_table <- zonal(r_binary, regions, fun = "sum") colnames(area_table) <- c("区域ID", "像素数量") # 示例:若单像素对应0.01mm²,计算实际面积 # area_table$实际面积 <- area_table$像素数量 * 0.01
方案三:用EBImage包(生物图像专用)
EBImage是Bioconductor的生物图像处理工具,自带自动阈值分割功能,更适配真菌培养皿图像:
library(EBImage) # 读取图像(支持多种格式) img <- readImage("20231031_110019.png") # 转为灰度图 img_gray <- channel(img, "gray") # 使用Otsu自动阈值分割二值图像 img_binary <- img_gray < otsu(img_gray) # 标记连通区域(neighbors=8为8邻接) regions <- bwlabel(img_binary, neighbors = 8) # 统计每个区域的像素数(排除背景ID=0) area_stats <- table(regions) area_stats <- area_stats[names(area_stats) != "0"]
关键注意事项
- 二值化阈值:需根据图像实际明暗调整,若自动阈值(如Otsu)效果不佳,可手动调整或尝试其他分割方法
- 连通性选择:4邻接仅识别上下左右连通的区域,8邻接包含对角线,需根据你的“岛屿”定义选择
- 实际面积转换:若需要物理面积,需提前获取图像的空间分辨率(如每个像素对应多少mm²),用像素数乘以该值即可
内容的提问来源于stack exchange,提问作者Emily Rowlands
相关产品推荐
相关产品推荐

