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 分箱宽度默认为 20bash 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 可视化报告。
基于 Python + OpenCV 的显微图像目标检测、统计与可视化分析项目实战
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 分箱宽度默认为 20bash 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 可视化报告。