在数字病理图像上先圈一大片组织,再在里面圈出核心区,是很常见的操作。按大区域导表,得到四个检测对象,而图上肉眼能数出十个,就有人怀疑检测过程丢了六个。另一个常见误会是,同一张视野换个格式导出,像素长宽未变,测得的每平方毫米密度却没有了。我们把十个位置固定的对象、两个嵌套矩形放进 QuPath 实跑,并把完全相同的像素分别保存成带物理标定的 TIFF 和普通 PNG。这个小项目可以分别复核对象层级和面积分母。
先区分图像、标注与检测对象
图像提供的是像素。标注对象可以表示组织边界、感兴趣区域或人工勾画的参考结构,检测对象则可以表示细胞核、细胞或其他被识别的实例。每个检测对象本身没有“每平方毫米”这样的量,要得到密度,必须先定义纳入的对象集合和区域面积。尤其当父标注内部嵌套子标注时,一个检测对象可以在几何上同时落入两个区域,在对象树里却只有一个直接父节点。问“这块组织有多少细胞”前,应先说明是数直接子对象、所有后代,还是中心点落在区域里的所有对象。QuPath 对象层级说明
对部分贴边的细胞,中心落在框内与轮廓只要相交就纳入,是两套不同规则。如果研究的是核中心密度,可事先规定按核中心归属。若研究的是阳性组织面积占比,更合适的统计对象可能是区域内部的像素面积。本文把所有检测对象都放在远离边界的位置,避免这项差异掩盖层级效果。换成真实切片后,推荐挑几枚跨越标注边界的对象手工对照,明确当前脚本的选择行为。将这种规则写进图注或结果表,后续跨视野复核才知道各列比较的是同一种量。
实跑经验|同一枚检测可以落在大框内,又是小框的直接子对象
我们安装 QuPath 0.7.0,使用它自己的命令行脚本入口分别打开两张像素相同的图。在一百二十八乘九十六像素的画布上构建宽一百、高六十的大矩形,以及完全嵌在其中、宽六十、高四十的核心矩形。随后创建两行五列共十个椭圆检测对象,使用软件的层级解析功能安排归属。其中六个中心落在小矩形内,另外四个只落在大矩形内。十个对象是按照已知坐标放置的,本次考察的是区域归属与测量,没有用它来评价核检测算法的准确率。命令行运行图像脚本的官方用法
对大矩形读取直接子对象并只数检测类型,得到四。用大矩形几何范围测试所有检测的中心,得到十。对核心矩形,两种办法都是六,因为本例没有更深的第三层标注。若需要“核心以外的组织”,应明确是大区扣除核心的差集,不能仅凭大区直接子对象数恰好等于四,就认为对所有项目都等同于几何差集。实际项目若另有第三层标注、排除区或未解析的对象,这种巧合可能立即消失。
| 量什么 | 整块大区 | 内嵌核心区 |
|---|---|---|
| 直接挂在标注下的检测数 | 4 | 6 |
| 中心落在范围内的全部检测数 | 10 | 6 |
| 原始像素面积 | 6000 像素² | 2400 像素² |
| 每像素 0.5 微米时的面积 | 1500 微米² | 600 微米² |

两份文件的像素内容逐值相同,TIFF 另存了每厘米两万个像素的标定。QuPath 读出水平与垂直都是每像素零点五微米。每个像素的面积要把两个方向的尺寸相乘,得到零点二五平方微米。六千平方像素的大区就对应一千五百平方微米,而非三千。无物理标定的 PNG 仍能给出六千平方像素和十个中心,我们把物理面积留空。若为了让报表看起来完整,直接把六千写进平方微米一栏,会将面积放大四倍,相应密度低估四倍。QuPath 图像像素与空间标定说明
def roi = annotation.getROI()
def calibration = getCurrentServer().getPixelCalibration()
def contained = getDetectionObjects().count {
def det = it.getROI()
roi.contains(det.getCentroidX(), det.getCentroidY())
}
def area = calibration.hasPixelSizeMicrons() ?
roi.getScaledArea(calibration.getPixelWidthMicrons(), calibration.getPixelHeightMicrons()) : null
println([centerCount: contained, areaMicronsSquared: area])
一个密度值应如何配对分子与分母
在本次带标定的图上,整块区域的中心密度是十除以一千五百平方微米。核心区是六除以六百,外圈是四除以剩余的九百。换算成每平方毫米,三者分别约为六千六百六十七、一万和四千四百四十四。这些数只用于手算,因为本例的组织和细胞都是人为设置的。如果无意中拿大区的四个直接子检测去除以包含核心的大区总面积,就会得到约两千六百六十七。分子只覆盖外圈,分母却覆盖整块组织,这个数字在表格中很难仅凭大小识别。
还要小心重复汇总。若已经把整块组织的十个对象作为一行,又把核心的六个作为一行,两行相加得到十六,只能说明两个范围重叠,无法代表两块独立组织的对象总数。做队列统计时可以给每个视野和每个标注保存唯一标识及父标识,再专门标记区域之间是互斥还是嵌套。对真正互斥的小区汇总密度时,用全部纳入对象的总数除以全部有效面积,和简单平均各小区密度也可能不同。组织面积差异越大,这一步越值得在一两个已知视野上手算。
遇到截图、缩略图或经过裁切的导出图,应回查原始扫描标尺与导出比例,只有来源明确才能补充物理标定。在原图上测一个已知长度并与导出图并排比较,往往能发现缩放一半却仍在沿用原像素尺寸的问题。把输出保存成区域标识、父标识、直接检测数、几何纳入数、有效面积和面积单位几列,就能定位分歧来自对象层级、边界规则还是标尺。仅保存已经换算后的密度,往往会把三种问题都隐藏在一个小数后面。
需要将确定好的区域规则推广到成批全切片时,可以先保留上述小视野作为脚本复核样例。团队若需批量运行并保存对象测量结果,可了解云生信的生物信息分析服务器。