关键是基于shapely模块中的within方法,判断信号点与ROI的包含关系。
### 根据单细胞分割的ROI进行过滤from roifile import roireadfrom shapely import geometry as geofrom shapely import within
fp = r"D:\data\xxd\250219\s2-z5-1_rois.zip"# cellpose 分割后导出的roi记录,ImageJ兼容rois = roiread(fp)
pts = rois[0].integer_coordinatespixelsize = 0.0313# 单位与 imaris 保持一致,为微米roi = geo.Polygon(pts*pixelsize)
info = []for idx, row in data2.iterrows(): p = geo.Point([row['x'], row['y']]) if within(p, roi): info.append([idx, row['mean'], row['volume'], row['Nearest 1 Neighbors Distance'], 1]) # idx 为 cluster 的索引,最后一个为细胞的索引data3 = pd.DataFrame(data=info, columns=['pid', 'mean', 'volume', 'NND', 'cell'])注意 ROI 记录是 cellpose 分割出来的。
python中可以使用 roifile 模块读取,顺带检查一下,是对的。