图片预处理教程(批量将序列图像合成为多帧 TIFF)¶
适用平台:Windows 10/11
主要工具:ImageJ(≥ 1.53) / Python(可选)
本教程指导课题组成员将显微镜或相机拍摄得到的一系列单帧图像(如 .tif / .png / .jpg)批量合成为单个多帧 TIFF 文件,以便后续轨迹追踪、显微分析等流程统一读取。
示例目录结构:
track_20250621/
├─ 10410 k12 1%agar duizhao 1/ (1000 张 .tif 或 .png)
├─ 10410 k12 1%agar duizhao 2/
├─ 10520 mutant 0.5%agar 1/
└─ …
目标:在 track_20250621 目录下生成
其中 Channels (c)=1、Slices (z)=1、Frames (t)=帧数,完全无压缩(必要时自动 BigTIFF)。
1. 前置准备¶
| 软件 | 说明 | 下载 |
|---|---|---|
| ImageJ | 内置 Bio‑Formats,宏功能完整 | https://ImageJ.sc/ |
| Python 3.9+(可选) | 需 tifffile 与 imageio 库 |
https://www.python.org/ |
2. ImageJ 批量宏¶
优点:零代码依赖、可视化调试、跨平台
缺点:需 GUI 环境、速度取决于硬盘 IO
2.1 保存宏文件¶
- 将以下代码保存为
batch_stack.ijm。 - 将 `` 修改为你的实验根目录(注意最后带
/或\\)。
setBatchMode(true);
rootDir = "E:/xwew/Methylcellulose_S_Motion/DK1622/qin/";
list = getFileList(rootDir);
for (i = 0; i < list.length; i++) {
if (File.isDirectory(rootDir + list[i])) {
dirPath = rootDir + list[i]; // 末尾已有 /
dirName = replace(list[i], "/", ""); // 去掉结尾 /
print("Processing: " + dirPath);
run("Image Sequence...", "open=&dirPath sort");
if (nImages==0) {
print(" Could not open image sequence.");
continue;
}
frames = nSlices;
run("Stack to Hyperstack...",
"order=xyzct channels=1 slices=1 frames=" + frames + " display=Grayscale");
outPath = rootDir + dirName + ".tif";
print(" Saving as: " + outPath);
saveAs("Tiff", outPath);
close(); // 关闭当前图像窗口
}
}
setBatchMode(false);
print("Done!");
2.2 运行宏¶
- 打开 ImageJ →
Plugins ▸ Macros ▸ Run…选择batch_stack.ijm。 - 宏运行进度在 Console 实时输出;出现
All done!即完成。 - 在
rootDir下检查生成的.tif文件。
2.3 常见问题¶
| 症状 | 可能原因 | 解决办法 | ||
|---|---|---|---|---|
| Unrecognized command: Stack to Hyperstack... | ImageJ 版本过旧 | 更新 ImageJ;确认菜单路径为 Image ▸ Hyperstacks ▸ Stack to Hyperstack… |
||
| > 4 GB 无法打开 | 软件不支持 BigTIFF | 使用新版 ImageJ、Napari、QuPath 或 Python tifffile |
3. Python 脚本(可选)¶
优点:无需 GUI,可在服务器/集群批处理
缺点:需要 Python 环境;若一次性加载大栈,内存占用较高
from pathlib import Path
import imageio.v2 as imageio # pip install imageio>=2.28
import tifffile # pip install tifffile
import numpy as np
root = Path(r'D:\02_Research\Bactrack\track_20250621') # 修改为根目录
suffixes = ('.tif', '.tiff', '.png', '.jpg')
for sub in [p for p in root.iterdir() if p.is_dir()]:
frames = sorted([f for f in sub.iterdir() if f.suffix.lower() in suffixes])
if not frames:
print(f'[跳过] {sub} 无图像'); continue
print(f'Processing {sub.name} ({len(frames)} frames)…')
stack = np.stack([imageio.imread(f) for f in frames]) # 形状: (t, y, x)
out = root / f'{sub.name}.tif'
tifffile.imwrite(
out, stack,
imagej=True,
metadata={'axes': 'TYX'}, # T, Y, X (c=1, z=1 省略)
photometric='minisblack',
bigtiff=True
)
print('→', out)
print('全部完成')
- 运行:
python batch_stack.py - 默认无压缩;如需无损压缩可加
compression='zlib' - 内存估算:
帧数 × 图像尺寸 × 数据位深 / 4(粗略),请根据硬件情况调整。
4. 校验与后续步骤¶
- 打开检查:用 ImageJ 或 Napari 打开生成的
.tif,Image ▸ Properties…查看 c/z/t 是否为 1/1/N。 - 预览:
Image ▸ Hyperstacks ▸ View ▸ Hyperstack Viewer,滚动时间轴 (t)。
5. 版本记录¶
| 日期 | 版本 | 说明 |
|---|---|---|
| 2025‑07‑02 | v1.0 | 首版发布,包含 ImageJ 宏与 Python 脚本 |
如有问题或改进建议,请在课题组 Wiki 开 Issue 或联系维护者 @yipeng。