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

如何用Python处理TIF序列 区分3D凝胶迁移单核细胞与背景

3D凝胶中单核细胞的TIF成像图
此前处理尝试的效果

低对比度3D凝胶单核细胞TIF序列处理与追踪方案

这类无标记3D凝胶成像的单核细胞与凝胶背景空域特征高度相似,仅靠单帧空域滤波、阈值分割无法实现有效区分,必须结合时域背景差分+形态匹配检测的思路实现信号提取与追踪,具体步骤如下:

1. 依赖库安装与帧序列读入

先安装所需依赖,优先用对科研TIF格式兼容性更好的tifffile读入文件,避免帧数据位深、编码解析错误:

pip install tifffile opencv-python numpy scipy pandas matplotlib trackpy scikit-image

批量读入所有TIF帧并按时间顺序排序:

import glob
import cv2
import numpy as np
import tifffile as tiff
import trackpy as tp
import pandas as pd
import matplotlib.pyplot as plt

# 替换为你的TIF文件存储路径
frame_paths = sorted(glob.glob("./tif_frames/*.tif"))
raw_frames = np.array([tiff.imread(p) for p in frame_paths], dtype=np.float32)

2. 单帧空域预处理

先消除单帧内的光照不均匀、大块凝胶背景噪声:

  • 取细胞直径5~10倍大小的高斯核提取单帧平缓背景,原图减去背景后归一化到8位灰度范围,消除全局光照不均
cell_diameter = 5  # 根据实际成像中细胞的像素直径调整
bg_kernel = cell_diameter * 8
spatial_corrected = []
for frame in raw_frames:
    bg = cv2.GaussianBlur(frame, (bg_kernel, bg_kernel), 0)
    corrected = frame - bg
    corrected = cv2.normalize(corrected, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U)
    spatial_corrected.append(corrected)
spatial_corrected = np.array(spatial_corrected)

3. 时域增强(核心分离步骤)

利用「运动细胞信号随时间变化、凝胶背景几乎静止」的特征做时域背景消除,这一步是解决单帧无法区分细胞和背景的关键:

  • 对每个时间点的帧,取前后各2~3帧的时间窗,沿时间轴计算中值得到该时间点的静态背景,当前帧减去该静态背景,即可完全滤除静止的凝胶纹理,仅保留运动的细胞信号
time_window = 3  # 前后各取3帧计算时域背景
enhanced_frames = []
for t in range(len(spatial_corrected)):
    t_start = max(0, t - time_window)
    t_end = min(len(spatial_corrected), t + time_window + 1)
    time_stack = spatial_corrected[t_start:t_end]
    time_bg = np.median(time_stack, axis=0).astype(np.uint8)
    enhanced = cv2.subtract(spatial_corrected[t], time_bg)
    # 3*3小核高斯模糊消除高频椒盐噪声
    enhanced = cv2.GaussianBlur(enhanced, (3,3), 0)
    # 可选:加CLAHE局部对比度增强进一步拉高细胞信号
    clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
    enhanced = clahe.apply(enhanced)
    enhanced_frames.append(enhanced)
enhanced_frames = np.array(enhanced_frames)

4. 细胞检测与轨迹关联

直接使用专门针对微粒追踪优化的trackpy库做检测和轨迹关联,比手动写OpenCV轮廓检测、卡尔曼滤波适配性更强,对低信噪比小圆点目标检测准确率更高:

# 检测所有帧中的细胞候选点
detections = tp.batch(
    enhanced_frames,
    diameter=cell_diameter + 2,  # 检测核大小略大于细胞直径
    minmass=120,  # 信号强度阈值,误检多就调高,漏检多就调低
    invert=False
)
# 轨迹关联:单帧最大搜索距离为细胞直径的3倍,允许细胞最多消失3帧再重新匹配
trajectories = tp.link(detections, search_range=cell_diameter*3, memory=3)
# 过滤误检:删除持续出现帧数少于10帧的短轨迹(多为噪声点)
valid_trajectories = tp.filter_stubs(trajectories, threshold=10)

5. 结果导出与轨迹绘制

# 导出轨迹坐标为CSV文件,包含帧号、细胞ID、x/y坐标、信号质量等字段
valid_trajectories.to_csv("cell_migration_trajectories.csv", index=False)

# 绘制轨迹叠加图
plt.figure(figsize=(12,12))
plt.imshow(spatial_corrected[0], cmap="gray")
tp.plot_traj(valid_trajectories, colorby="particle", lw=1)
plt.axis("off")
plt.savefig("cell_track_plot.png", dpi=300, bbox_inches="tight")

调参说明:如果增强后仍有较多背景噪声,可适当增大时间窗大小;如果细胞运动速度快,适当增大轨迹关联的search_range参数即可。此前使用skimage、holoviews处理无效的核心原因是仅做了单帧空域处理,未利用时域信息区分运动目标和静态背景。

内容的提问来源于stack exchange,提问作者lupus silvae

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:48:19