1. 项目背景

在植物表型、显微成像和实验图像分析中,经常需要对大量显微图片中的目标物进行检测、计数和统计。例如本项目中的 `psvexport` 数据,每个品种对应一个叶子文件夹,每个品种下包含 10x 和 20x 两种镜头拍摄的图像。人工逐张统计不仅耗时,而且主观误差较大。

因此,搭建了一套基于 Python 的自动化图像分析流程,实现了:

- 批量读取显微图像
- 自动检测青色/蓝色目标物
- 生成标注图
- 输出 Excel 统计表
- 按品种和镜头绘制数量分布直方图
- 按品种和镜头绘制目标物像素大小分布直方图
- 自动整理输出到 `results` 文件夹

整个流程适合在 PyCharm 中直接运行,并支持控制台交互选择数据。

2. 项目目录结构

项目主要目录如下:

ZWB_Task/
├── sources/                         # 放入待处理原始数据
│   └── psvexport/
│       ├── SZ-1/
│       ├── SZ-103/
│       └── ...
├── results/                         # 自动生成分析结果
├── cyan_detector.py                 # 公共目标检测逻辑
├── image_counter.py                 # 图像计数与标注
├── colorize_images.py               # 图像染色
├── image_mosaic.py                  # 按数量排序生成组图
├── psvexport_count_histograms.py    # 绘制目标数量分布图
├── psvexport_object_pixel_histograms.py # 绘制目标像素大小分布图
├── run_helpers.py                   # 交互与路径管理工具
└── requirements.txt                 # Python 依赖

其中 `sources` 用于存放原始数据,`results` 用于保存所有运行结果,避免污染原始文件。

3. 环境准备

推荐使用 Python 3.10 以上版本。本项目当前在 Python 3.13 环境下运行。

安装依赖:

安装依赖:
```bash
pip install -r requirements.txt
```
主要依赖包括:
```text
opencv-python
numpy
openpyxl
tqdm
matplotlib
```
如果网络访问 PyPI 不稳定,可以使用国内镜像源:


```bash
python -m pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple --timeout 120
```

 4. 数据组织方式

原始数据放入 `sources` 文件夹。例如:

```text
sources/
└── psvexport/
    ├── SZ-1/
    │   ├── SZ-1_sz-1 0.1g 10x-1_ch00.tif
    │   ├── SZ-1_sz-1 0.1g 10x-2_ch00.tif
    │   ├── SZ-1_sz-1 0.1g 20x-1_ch00.tif
    │   └── ...
    ├── SZ-103/
    └── ...
```
本项目默认只处理文件名以 `ch00` 结尾的图像。这样可以自动避开其他通道图像,例如 `ch01`。

5. 图像检测与计数

核心检测逻辑封装在 `cyan_detector.py` 中。主要流程如下:

1. 读取图像
2. 转换到 HSV 颜色空间
3. 根据颜色阈值提取青色/蓝色区域
4. 进行形态学开闭运算,减少噪声
5. 提取轮廓
6. 按面积、圆度、半径等条件过滤目标
7. 计算目标数量和目标面积
8. 生成标注图和 Excel 表格

运行计数脚本:

```bash
python image_counter.py
```
PyCharm 中直接运行时,控制台会列出 `sources` 下的数据选项,输入编号即可。

也可以直接指定路径:
```bash
python image_counter.py --roots sources/psvexport
```
运行后会在 `results` 下生成类似目录:
```text
results/
└── image_counter_20260722_200611/
    ├── image_counter_results_20260722_200611.xlsx
    └── psvexport/
        ├── SZ-1/
        │   ├── annotated_xxx.tif
        │   └── ...
        └── ...
```
Excel 表格字段包括:

| 字段 | 含义 |
|---|---|
| Root | 根目录名称 |
| Level1 | 品种名称 |
| ImageName | 图片名称 |
| AreaRatio | 目标面积占比 |
| ObjectCount | 当前图片检测到的目标数量 |
| ObjectName | 目标编号 |
| ObjectPixels | 单个目标的像素面积 |
其中 `ObjectCount` 用于统计每张图的目标数量,`ObjectPixels` 用于分析单个目标物的大小分布。

6. 按数量生成组图

在获得计数表格之后,可以按照 `ObjectCount` 从大到小排序生成组图:
```bash
python image_mosaic.py
```
脚本会自动从 `results` 中选择 `image_counter_results_*.xlsx` 文件,并根据数量排序生成马赛克组图。

常用参数:
```bash
python image_mosaic.py --group-size 60 --cols 10 --cell-size 360
```
参数含义:

| 参数 | 含义 |
|---|---|
| `--group-size` | 每张组图包含多少张图片 |
| `--cols` | 每张组图的列数 |
| `--cell-size` | 每个小图格子的尺寸 |

7. 绘制每个品种的目标数量分布图

对于 `psvexport` 数据,每个品种包含 10x 和 20x 两种镜头。我们可以基于 `ObjectCount` 绘制每个品种在不同镜头下的目标数量频率分布直方图。

运行:
```bash
python psvexport_count_histograms.py
```
也可以指定表格:

```bash
python psvexport_count_histograms.py --excel results/image_counter_20260722_200611/image_counter_results_20260722_200611.xlsx
```
输出示例:

```text
results/image_counter_20260722_200611/psvexport/SZ-1/
├── SZ-1_10x_count_histogram.png
└── SZ-1_20x_count_histogram.png
```
每张图中包含:

- 目标数量分布直方图
- 均值线
- 中位数线
- n、mean、std、variance 统计信息

颜色采用马卡龙风格,整体比较清爽,适合实验汇报和论文辅助图。

8. 绘制目标物像素大小分布图

除了每张图中检测到的目标数量,我们还希望分析单个目标物的像素大小分布。这里使用 Excel 表格中的 `ObjectPixels` 字段。

运行:
```bash
python psvexport_object_pixel_histograms.py
```
```bash
python psvexport_object_pixel_histograms.py --excel results/image_counter_20260722_200611/image_counter_results_20260722_200611.xlsx
```
输出目录为:

```text
results/image_counter_20260722_200611/psvexport/object_pixel_histograms/
├── SZ-1/
│   ├── SZ-1_10x_object_pixel_histogram.png
│   └── SZ-1_20x_object_pixel_histogram.png
├── SZ-103/
└── ...
```
为了避免少数极端大目标把横坐标拉得过长,脚本默认使用 99% 分位数自动确定横坐标范围,同时将超过范围的目标合并到最后一个区间,并在图中标注数量。例如:
```text
>200: 55
```
表示有 55 个目标物像素面积超过当前显示范围。
可调整参数:
```bash
python psvexport_object_pixel_histograms.py --x-percentile 95
```
如果希望保留更多尾部数据:
```bash
python psvexport_object_pixel_histograms.py --x-percentile 99.5
```
分箱宽度默认为 20:
```bash
python psvexport_object_pixel_histograms.py --bin-width 20
```

9. 可视化风格设计

为了让图像更适合展示和汇报,绘图时做了以下设计:

- 使用柔和马卡龙配色
- 10x 和 20x 使用不同主色
- 去除顶部和右侧边框
- 使用浅灰色网格线
- 保留均值线和中位数线
- 统计信息放置在右上角
- 横坐标自动适配数据主体范围
- 输出高 DPI PNG 图片

这种风格不会过度花哨,但比默认 Matplotlib 图更清爽。

10. 项目中的几个优化点

10.1 公共检测逻辑抽离

最开始不同脚本中都有重复的检测代码,后续将其统一封装到 `cyan_detector.py`。这样后续如果需要调整阈值、面积过滤条件或标注方式,只需要改一处。

10.2 统一输入输出管理

项目将原始数据和结果文件分离:

- `sources` 保存原始数据
- `results` 保存运行结果

这样可以避免处理结果和原始图片混在一起。

10.3 PyCharm 友好的交互方式

脚本支持直接在 PyCharm 中运行。无参数运行时,会自动列出可选数据或结果表格,用户只需要输入编号。

10.4 长尾分布的横坐标处理

目标物像素大小分布通常是明显长尾分布。如果直接按照最大值设置横坐标,主体分布会被挤压在左侧,图像不平衡。因此脚本使用分位数控制显示范围,并将超出范围的值合并统计。

11. 完整运行流程

推荐流程如下:
```bash
# 1. 将数据放入 sources/psvexport

# 2. 批量检测与计数
python image_counter.py

# 3. 按数量排序生成组图
python image_mosaic.py

# 4. 绘制每个品种的目标数量分布图
python psvexport_count_histograms.py

# 5. 绘制每个品种的目标物像素大小分布图
python psvexport_object_pixel_histograms.py
```
如果需要指定某一次结果表格,可以使用:
```bash
python psvexport_count_histograms.py --excel results/image_counter_xxx/image_counter_results_xxx.xlsx
python psvexport_object_pixel_histograms.py --excel results/image_counter_xxx/image_counter_results_xxx.xlsx
```

12. 总结

这个项目实现了一套完整的显微图像自动分析流程,从图像读取、目标检测、批量计数,到 Excel 统计和科研风格可视化,基本覆盖了实验数据整理中的核心需求。

相比手动统计,该流程的优势是:

- 批量处理效率高
- 结果可复现
- 输出结构清晰
- 图像和表格自动归档
- 可根据品种和镜头进行精细化分析

后续还可以继续扩展,例如加入更多颜色通道、增加交互式阈值调整、导出 PDF 报告,或者将所有结果自动汇总成一个 HTML 可视化报告。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐