材料科学研究中,背散射电子(BSE)图像的不同灰度代表不同物相。
人工标注效率低,主观性强。写个软件自动算。
一、项目背景
在材料科学研究中,背散射电子(Backscattered Electron, BSE)显微镜是分析材料微观结构的重要工具。不同物相由于原子序数差异,在BSE图像中呈现不同的灰度亮度。
通过对BSE图像进行多相分割分析,可以定量计算各物相的含量比例,为材料性能研究提供数据支撑。
传统方法的痛点:
-
依赖人工标注或半手动处理
-
效率低下
-
受主观因素影响大
目标:开发自动化BSE电镜多相含量分析软件,从图像加载→预处理→自动分割→结果可视化→报表导出,全流程自动化。
二、功能定位
| 功能 | 说明 |
|---|---|
| 多相自动分割 | 支持2~5个物相的自动识别与分割 |
| 手动微调 | 支持手动调整阈值,精确控制分割效果 |
| 感兴趣区域(AOI) | 支持矩形、圆形、多边形AOI选择 |
| 像素标定 | 用户自行标定μm/像素比例,精确计算面积 |
| 实时预览 | 手动模式下实时查看阈值调整效果 |
| 结果导出 | 支持图像导出和Excel报表生成 |
| 参数模板 | 支持保存和加载参数配置 |
三、技术栈
| 组件 | 技术选型 | 理由 |
|---|---|---|
| 编程语言 | Python | 科学计算库丰富,开发快,跨平台 |
| GUI框架 | PySide6 | Qt的Python绑定,功能强大,LGPL商业友好 |
| 图像处理 | OpenCV (cv2) | 核心算法库 |
| 数值计算 | NumPy | 数组运算基础 |
| 图像辅助 | Pillow (PIL) | 辅助格式处理 |
| 报表导出 | openpyxl | 生成Excel报告,支持嵌入图像 |
四、模块划分
text
Metis_PhaseAnalysis/
├── main.py # 主程序入口,GUI界面与业务逻辑
├── preprocess.py # 图像预处理模块
├── seg_multi_otsu.py # 多级Otsu分割模块
├── morph_opt.py # 形态学优化模块
├── size_calc.py # 面积计算模块
├── draw_result.py # 结果绘制模块
└── report_export.py # 报表导出模块
| 模块 | 文件名 | 职责 |
|---|---|---|
| 图像预处理 | preprocess.py | 16-bit转8-bit、降噪、对比度增强 |
| 多级分割 | seg_multi_otsu.py | Otsu自动/手动阈值分割,生成掩码 |
| 形态学优化 | morph_opt.py | 开闭运算,优化分割掩码质量 |
| 面积计算 | size_calc.py | 像素计数、面积换算、百分比计算 |
| 结果绘制 | draw_result.py | 识别结果叠加绘制、图像保存 |
| 报表导出 | report_export.py | Excel报表生成、图像嵌入 |
五、数据流设计
text
图像文件 → 预处理 → 多级Otsu分割 → 形态学优化 → 面积计算
↓
结果显示 ← 结果绘制 ← 掩码数据 Excel报表导出
数据格式约定
| 数据类型 | 格式 | 说明 |
|---|---|---|
| 图像数据 | NumPy数组 (uint8) | 预处理后的灰度图 |
| 分割掩码 | dict |
{'phase1': mask, 'phase2': mask, ...} |
| 计算结果 | dict |
{'phase1': {'pixel_count': int, 'area_um2': float, 'percentage': float}, ...} |
| 阈值数据 | list |
[T1, T2, T3, T4] |
模块接口设计
算法模块通过函数调用和标准数据结构交互,不依赖任何GUI组件。
python
# 预处理
processed_img = preprocess_image(img_path)
# 分割
seg_result = multi_otsu_segmentation(processed_img, phase_count, user_thresholds)
masks = seg_result['masks']
# 形态学优化
optimized_masks = morphological_optimization(masks)
# 面积计算
results = calculate_phase_area(optimized_masks, magnification, pixel_per_um)
# 结果绘制
result_img = draw_segmentation_result(original_img, optimized_masks, output_path)
# 报表导出
export_report(results, magnification, output_path, original_img_path, phase_img_paths)
六、设计原则
| 原则 | 说明 |
|---|---|
| 模块独立 | 算法模块完全独立于GUI,不依赖任何PySide6组件 |
| 数据流清晰 | 数据在模块间单向流动,输入输出明确 |
| 容错性 | 各模块内部进行参数校验和异常处理 |
| 可扩展 | 物相数量支持动态扩展(2~5相),分割算法可替换 |
七、踩坑记录(提前预警)
-
算法模块不要import PySide6:保持纯OpenCV/NumPy,方便后续打包和测试
-
16-bit图像处理:BSE图像常见16-bit,预处理时要正确转换到8-bit
-
掩码数据类型 :用
np.uint8,0/255二值,方便OpenCV显示 -
AOI坐标:QGraphicsView的坐标体系与图像坐标要正确映射
下篇预告
下一篇写PySide6 GUI框架搭建:主窗口布局、控制面板、参数面板、图像显示区。