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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 02:34:55