如何用R的EBImage包读取16位TIFF并保留像素强度作为标注掩膜
原因说明
EBImage读取16位无符号灰度TIFF时默认会执行归一化操作:将原始0~65535范围的整数值除以65535,转换为[0,1]区间的double类型数值。你观测到的最大值0.08792248恰好等于5750/65535的计算结果,和你掩膜的标签最大值完全匹配。
直接将小于1的double值强制转换为integer会截断小数部分,因此所有值都会变为0。
解决方法
方法1:读取后反算恢复原始标签
直接对归一化后的数值做反向缩放,还原原始整数值:
objectMask <- readImage("/Volumes/myHD/objectMask.tiff") # 反归一化到16位整数范围,四舍五入避免精度误差导致标签错误 objectMask@.Data <- round(objectMask@.Data * 65535) # 修改存储模式为integer,和bwlabel输出格式一致 storage.mode(objectMask@.Data) <- "integer" # 验证输出 range(objectMask@.Data)
方法2:读取时直接保留原始整数值
可以先通过tiff包读取原始整数数据,再转换为EBImage的Image对象:
library(tiff) library(EBImage) # as.is=TRUE表示不做归一化,直接返回原始整数值 raw_mask <- readTIFF("/Volumes/myHD/objectMask.tiff", as.is = TRUE) # 转换为EBImage标准格式 objectMask <- Image(raw_mask, colormode = "grayscale") # 验证输出 storage.mode(objectMask@.Data) range(objectMask@.Data)
两种方法得到的结果都可以直接作为标注图像使用,和bwlabel的输出格式完全兼容。
内容的提问来源于stack exchange,提问作者traumenCapote
相关产品推荐
相关产品推荐

