跳转至

图片预处理教程(批量将序列图像合成为多帧 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 目录下生成

10410 k12 1%agar duizhao 1.tif
10410 k12 1%agar duizhao 2.tif
10520 mutant 0.5%agar 1.tif

其中 Channels (c)=1、Slices (z)=1、Frames (t)=帧数,完全无压缩(必要时自动 BigTIFF)。


1. 前置准备

软件 说明 下载
ImageJ 内置 Bio‑Formats,宏功能完整 https://ImageJ.sc/
Python 3.9+(可选) tifffileimageio https://www.python.org/

2. ImageJ 批量宏

优点:零代码依赖、可视化调试、跨平台
缺点:需 GUI 环境、速度取决于硬盘 IO

2.1 保存宏文件

  1. 将以下代码保存为 batch_stack.ijm
  2. `` 修改为你的实验根目录(注意最后带 /\\)。
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 运行宏

  1. 打开 ImageJPlugins ▸ Macros ▸ Run… 选择 batch_stack.ijm
  2. 宏运行进度在 Console 实时输出;出现 All done! 即完成。
  3. 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. 校验与后续步骤

  1. 打开检查:用 ImageJ 或 Napari 打开生成的 .tifImage ▸ Properties… 查看 c/z/t 是否为 1/1/N。
  2. 预览Image ▸ Hyperstacks ▸ View ▸ Hyperstack Viewer,滚动时间轴 (t)。

5. 版本记录

日期 版本 说明
2025‑07‑02 v1.0 首版发布,包含 ImageJ 宏与 Python 脚本

如有问题或改进建议,请在课题组 Wiki 开 Issue 或联系维护者 @yipeng