当前位置: 首页 > news >正文

ImageJ / Fiji 批量提取文件夹中图像的 ROI 区域并保存为 TIFF

在进行显微图像分析时,经常需要从大量图像中批量提取指定的 ROI 区域。如果手动逐张打开图像、选择 ROI、裁剪并保存,不仅效率很低,而且容易出现操作误差。

本文提供一个基于ImageJ / Fiji Macro的批处理脚本,可以实现以下功能:

  1. 批量读取指定文件夹中的图像;
  2. 加载提前保存好的 ROI 文件;
  3. 对每一张图像提取相同 ROI 区域;
  4. 将提取后的 ROI 图像自动保存到指定输出文件夹;
  5. 支持.tif.tiff.png.jpg.jpeg等常见图像格式。

该方法适用于需要对同一批图像进行相同区域裁剪、细胞局部区域提取、显微图像 ROI 分析等场景。

一、使用前准备

在运行代码前,需要先准备以下内容:

  1. 存放原始图像的文件夹;
  2. 已经选定并保存好的 ROI 文件;
  3. 用于保存提取结果的输出文件夹。

ROI 文件一般通过 ImageJ 的 ROI Manager 保存。

具体操作如下:

打开图像后,使用矩形、椭圆、多边形或自由选择工具圈定 ROI 区域,然后点击:

Analyze > Tools > ROI Manager

在 ROI Manager 中点击:

Add

如果有多个 ROI,可以依次添加。添加完成后,点击:

More > Save...

将 ROI 保存为.zip文件,例如:

ROIs.zip

二、完整 ImageJ / Fiji Macro 代码

将下面代码复制到 ImageJ / Fiji 的 Macro 编辑器中即可运行。

// ============================================================ // Batch Extract ROI Regions in ImageJ / Fiji // 功能:批量提取文件夹中所有图像的 ROI 区域,并保存为 TIFF 文件 // 作者:百变小水果 // 适用软件:ImageJ / Fiji // ============================================================ // ------------------------------------------------------------ // 1. 选择输入图像文件夹 // ------------------------------------------------------------ inputDir = getDirectory("Choose input image folder"); // ------------------------------------------------------------ // 2. 选择已经保存好的 ROI zip 文件 // ------------------------------------------------------------ roiPath = File.openDialog("Choose ROI zip file"); // ------------------------------------------------------------ // 3. 选择输出文件夹 // ------------------------------------------------------------ outputDir = getDirectory("Choose output folder"); // ------------------------------------------------------------ // 4. 设置支持的图像格式 // ------------------------------------------------------------ extensions = newArray(".tif", ".tiff", ".png", ".jpg", ".jpeg"); // ------------------------------------------------------------ // 5. 获取输入文件夹中的所有文件 // ------------------------------------------------------------ fileList = getFileList(inputDir); // ------------------------------------------------------------ // 6. 打开 ROI Manager 并加载 ROI 文件 // ------------------------------------------------------------ run("ROI Manager..."); roiManager("Reset"); roiManager("Open", roiPath); // 获取 ROI 数量 roiCount = roiManager("Count"); if (roiCount == 0) { exit("No ROI found. Please check your ROI zip file."); } // ------------------------------------------------------------ // 7. 开启批处理模式,提高运行速度 // ------------------------------------------------------------ setBatchMode(true); // ------------------------------------------------------------ // 8. 遍历输入文件夹中的所有图像 // ------------------------------------------------------------ for (i = 0; i < fileList.length; i++) { fileName = fileList[i]; // 跳过子文件夹 if (File.isDirectory(inputDir + fileName)) { continue; } // 判断是否为支持的图像格式 lowerName = toLowerCase(fileName); isImage = false; for (e = 0; e < extensions.length; e++) { if (endsWith(lowerName, extensions[e])) { isImage = true; } } if (!isImage) { continue; } // -------------------------------------------------------- // 9. 打开当前图像 // -------------------------------------------------------- open(inputDir + fileName); originalTitle = getTitle(); // 去掉文件扩展名,作为输出文件名前缀 dotIndex = lastIndexOf(fileName, "."); if (dotIndex >= 0) { baseName = substring(fileName, 0, dotIndex); } else { baseName = fileName; } // -------------------------------------------------------- // 10. 对当前图像中的每一个 ROI 进行提取 // -------------------------------------------------------- for (r = 0; r < roiCount; r++) { selectWindow(originalTitle); // 选择第 r 个 ROI roiManager("Select", r); // 获取 ROI 名称 roiName = Roi.getName(); if (roiName == "") { roiName = "ROI_" + (r + 1); } // 清理 ROI 名称中的非法文件名字符 roiName = replace(roiName, "/", "_"); roiName = replace(roiName, "\\", "_"); roiName = replace(roiName, ":", "_"); roiName = replace(roiName, "*", "_"); roiName = replace(roiName, "?", "_"); roiName = replace(roiName, "\"", "_"); roiName = replace(roiName, "<", "_"); roiName = replace(roiName, ">", "_"); roiName = replace(roiName, "|", "_"); // ---------------------------------------------------- // 11. 复制 ROI 区域 // ---------------------------------------------------- // 对于单张图像,会复制当前 ROI 区域; // 对于 stack 或 hyperstack 图像,会尽量保留原始堆栈结构。 run("Duplicate...", "title=" + baseName + "_" + roiName + " duplicate"); // ---------------------------------------------------- // 12. 保存提取后的 ROI 图像 // ---------------------------------------------------- saveAs("Tiff", outputDir + baseName + "_" + roiName + ".tif"); // 关闭当前 ROI 图像 close(); } // -------------------------------------------------------- // 13. 关闭原始图像 // -------------------------------------------------------- selectWindow(originalTitle); close(); } // ------------------------------------------------------------ // 14. 关闭批处理模式 // ------------------------------------------------------------ setBatchMode(false); print("Batch ROI extraction finished.");

三、运行方法

打开 Fiji 或 ImageJ 后,按照以下步骤运行:

  1. 选择:
Plugins > New > Macro
  1. 将上面的代码复制进去;
  2. 点击:
Run
  1. 程序会依次要求选择:
原始图像文件夹 ROI zip 文件 输出结果文件夹
  1. 选择完成后,程序会自动批量处理图像。

四、输出结果

假设输入文件夹中有如下图像:

image1.tif image2.tif image3.tif

ROI 文件中包含两个 ROI:

ROI_1 ROI_2

那么输出文件夹中会生成:

image1_ROI_1.tif image1_ROI_2.tif image2_ROI_1.tif image2_ROI_2.tif image3_ROI_1.tif image3_ROI_2.tif

也就是说,每一张图像都会按照 ROI 文件中的区域进行裁剪,并分别保存为新的 TIFF 文件。

本文提供了一个基于 ImageJ / Fiji Macro 的批量 ROI 提取脚本。通过该脚本,可以自动完成图像读取、ROI 加载、区域裁剪和结果保存等步骤,适合用于显微图像分析、细胞图像定量分析以及批量图像预处理流程。

相比手动逐张裁剪,该方法可以显著提高处理效率,并减少人为操作误差。

http://www.cnnetsun.cn/news/3889344.html

相关文章:

  • 从 Retinex 到扩散模型:视频图像夜场景增强算法全景深度剖析
  • Godot打字机效果实现:从基础到高级的完整指南
  • 踩坑血泪史!Java Optional 6大致命误区,别再用来优雅判空了
  • 手把手搭建 Spring AI 开发环境:依赖引入、版本选择、项目初始化
  • 移动电源新国标|电量计完整验证测试清单21
  • 【避坑指南】Kimi 生成的图片代码怎么用,巧用 AI 导出鸭规避代码转文件、格式错乱各类问题
  • 每日热门skill-炸裂开源!华为诺亚放大招:MindMemOS 让 AI Agent 真正「不忘事」,LoCoMo 跑出 94.03 分碾压同级
  • 龙岗网站建设公司哪家好:揭秘避坑指南与选择逻辑
  • Label Studio终极指南:5分钟搭建你的AI数据标注流水线
  • 技能水平评估_self-assessment
  • GeoJSON.io完整指南:5分钟掌握免费地图数据可视化终极工具
  • JavaScript AST解析实战:从代码到抽象语法树的完整操作指南
  • 9 款 AI 写论文哪个好?实测横评,毕夏 AI 官网凭借硬核学术实力脱颖而出
  • FModel终极指南:解锁虚幻引擎游戏资源的完整免费解决方案
  • Hadoop机架感知原理与配置优化实战
  • Nginx性能调优实战:从基础配置到高级优化
  • KMS_VL_ALL_AIO:为什么这个智能激活脚本能解决你90%的Windows和Office激活烦恼
  • Mem Reduct深度解析:Windows内存管理的瑞士军刀如何革新系统优化体验
  • 腾讯云轻量服务器部署Hermes Agent:高吞吐免配置AI Agent实战指南
  • 小白程序员必看:收藏这5个AI Agent实战案例,一天搞定工作减负!
  • Unity WebGL微信小程序部署:Windows环境系统化配置与优化指南
  • SDC命令详解:使用create_cell和remove_cell命令进行编辑
  • Pygame-CE入门:从Surface、Rect到游戏循环的Python游戏开发实践
  • 3dsconv终极指南:轻松将3DS游戏文件转换为CIA格式
  • 跨境o2o网站建设方案:打破虚实界限的实战指南与深度思考
  • 基于LimeSDR与开源软件的低成本北斗三代B1C信号模拟源实现
  • 抖音无水印批量下载工具终极指南:一键获取高清视频资源
  • Leveraging Large Language Models for Identifying Knowledge Components
  • AI驱动的网络攻击:生成式大模型如何成为“钓鱼邮件工厂”?
  • PL2303驱动终极修复指南:如何在Windows 10上拯救你的老设备