docs: 更新README,新增Web应用和打包说明

- 新增Flask Web应用介绍和三种运行方式
- 新增PyInstaller打包流程
- 更新项目结构,包含web/、build_exe.py等
- 精简两版实现描述,突出各自特点

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-08 21:41:03 +08:00
parent dd145d7651
commit e21595e72c
+109 -63
View File
@@ -1,25 +1,75 @@
# cDNA 微阵列图像处理作业 # cDNA 微阵列图像处理作业
> 刘航宇 | 河南理工大学计算机学院 | 2026 > 刘航宇 | 河南理工大学计算机学院 | 2026
>
---
## 项目概述
河南理工大学计算机学院图像处理课程作业。Python 实现 cDNA 微阵列图像的**网格划分**与**阈值分割**,配套 Web 可视化界面和 Windows 可执行文件(exe)。
--- ---
## 项目结构 ## 项目结构
``` ```
src/ cDNA微阵列图像处理作业/
├── cDNA_segmentation.py # 原版:网格划分 + 三种阈值分割 + TV去噪 ├── src/
── cDNA_gridding_simple.py # 简化版:网格划分,用于课堂讲解 │ ├── cDNA_segmentation.py # 版:网格划分 + 三种阈值分割 + TV去噪
│ └── cDNA_gridding_simple.py # 简化版:仅网格划分,用于课堂讲解
results/ # 原版输出(6张PNG)
results_simple/ # 简化版输出(网格叠加图 + 流程图) ├── web/ # Flask Web 应用
docs/ │ ├── app.py # Flask 主程序
└── gridding_simple_tutorial.md # 简化版逐行代码讲解教程 │ ├── launcher.py # PyInstaller 打包入口
│ ├── templates/index.html # 前端页面
│ └── static/style.css # 样式文件
├── build_exe.py # PyInstaller 打包脚本
├── cDNA_Analyzer.spec # PyInstaller spec 配置
├── flowchart.drawio # 算法流程图(用 Draw.io 打开)
├── results/ # 原版输出图像(6张)
├── results_simple/ # 简化版输出图像(6张)
├── docs/ # 技术文档
│ ├── cDNA 微阵列网格划分.md # 算法详解
│ ├── 两版差异说明.md # 简化版 vs 原版对比
│ └── 依赖库清单.md # Python 依赖
├── cDNA图像处理实例/ # 课程示例数据
└── 参考资料/ # MATLAB 参考代码 + 论文 PDF
``` ```
--- ---
## 两个Python实现 ## 快速开始
### 方式一:Windows 可执行文件(推荐)
下载 `dist/cDNA_Analyzer.exe` 并双击运行,浏览器自动打开 `http://localhost:5000`,上传图像即可处理。
### 方式二:Web 开发模式
```bash
cd web
python app.py
# 浏览器自动打开 http://localhost:5000
```
### 方式三:命令行脚本
```bash
# 简化版(课堂主讲,约150行)
python src/cDNA_gridding_simple.py
# 输出:results_simple/ 下 6 张图
# 原版(完整实现,430行)
python src/cDNA_segmentation.py
# 输出:results/ 下 6 张图
```
---
## 两种 Python 实现
### 简化版 `cDNA_gridding_simple.py`(课堂主讲) ### 简化版 `cDNA_gridding_simple.py`(课堂主讲)
@@ -27,16 +77,10 @@ docs/
``` ```
1. 灰度图 → 每列/行灰度值求和 → 投影曲线 1. 灰度图 → 每列/行灰度值求和 → 投影曲线
2. 阈值 X = (max - min) × 10%,曲线减去 X 2. Otsu 求自适应百分比 = T/255
3. 正 = 斑点,负 = 空隙 → 找过零点 → 配对取中点 → 划线 3. 阈值 X = (max - min) × 百分比,曲线减去 X
``` 4. 正 = 斑点,负 = 空隙 → 找过零点 → 配对取中点 → 划线
5. 逐格 Otsu 分割 + keep_largest_object + remove_small_objects
**运行**
```bash
cd src
python cDNA_gridding_simple.py
# 输出:results_simple/gridding_simple.png
``` ```
**特点** **特点**
@@ -44,67 +88,69 @@ python cDNA_gridding_simple.py
- 约 150 行代码,带详细中文注释 - 约 150 行代码,带详细中文注释
- 核心逻辑仅 30 行 - 核心逻辑仅 30 行
- 与原版网格线位置误差为 **0 像素** - 与原版网格线位置误差为 **0 像素**
- `find_gap_lines` 函数:减阈值 → 判断正负 → 找过零点 → 配对空隙中点 - 完全自动化,无需人工设定参数
### 原版 `cDNA_segmentation.py`(完整实现) ### 原版 `cDNA_segmentation.py`(完整实现)
**包含模块** | 模块 | 算法 | 参照 |
| 模块 | 算法 | 依赖 |
|------|------|------| |------|------|------|
| 网格划分 | 投影 → 自相关 → 白顶帽 → Otsu → 质心 | numpy, scipy, skimage | | 网格划分 | 投影 → 自相关 → 白顶帽 → Otsu → 质心 | MATLAB `GriddingAndCV.m` |
| 阈值分割 | 人工阈值、Otsu 自动阈值、迭代阈值 | 同上 | | 阈值分割 | 人工阈值、Otsu 自动阈值、迭代阈值 | |
| 去噪 | TV 全变分去噪(Chambolle 投影) | 同上 | | 去噪 | TV 全变分去噪(Chambolle 投影) | MATLAB `tvdenoise.m` |
| 后处理 | 去小连通域、保留最大连通域 | 同上 | | 后处理 | 去小连通域、保留最大连通域 | MATLAB `choice.m` |
**运行**
```bash
cd src
python cDNA_segmentation.py
# 输出:results/ 下 6 张图
```
**输出文件**
| 文件 | 内容 |
|------|------|
| `result_gridding.png` | 网格划分:原图+投影曲线+直方图 |
| `result_gridding_overlay.png` | 网格线叠加到原图 |
| `result_threshold_compare.png` | 三种阈值方法(人工/Otsu/迭代)对比 |
| `result_iterative_convergence.png` | 迭代阈值收敛曲线 |
| `result_full_segmentation.png` | 全图逐块 Otsu 分割结果 |
| `result_I_bw.png` | 最终二值图 |
--- ---
## 两版对比 ## Web 应用功能
| | 简化版 | 原版 | - **图像上传**:支持 PNG、JPG、TIFF 等格式,最大 50MB
|---|---|---| - **自动处理**:网格划分 + 逐格分割 + 后处理
| 功能 | 仅画网格线 | 网格 + 分割 + 去噪 | - **6 张可视化图表**
| 核心算法 | 加减乘除 | 自相关 + 形态学 + Otsu | 1. 网格线叠加原图
| 代码行数 | 150 | 430 | 2. 列投影曲线
| 检测网格线数 | 22×22 | 22×22 | 3. 行投影曲线
| 线条位置 | 42, 77, 112, … | 42, 77, 112, … | 4. 灰度直方图 + Otsu 阈值
| **误差** | **0 像素** | — | 5. 分割结果(后处理前)
6. 后处理结果
- **统计信息**:检测到的斑点数、Otsu 阈值、网格尺寸等
--- ---
## 技术文档
- `docs/gridding_simple_tutorial.md` — 简化版 190 行逐行讲解,含 ASCII 图解
- `results_simple/flowchart.drawio` — 算法流程图,用 Draw.io 打开
## 输入数据 ## 输入数据
`cDNA.png`820×820 RGB,来自 GEO 数据库 GSM16390Cy3/Cy5 双色荧光) - `cDNA.png`820×820 RGB,来自 GEO 数据库 GSM16390Cy3/Cy5 双色荧光)
- 23×23 斑点阵列,斑点间距约 35px,每斑点约 18px 宽
---
## 打包说明
使用 PyInstaller 将 Web 应用打包为单个 exe 文件:
```bash
python build_exe.py
# 输出:dist/cDNA_Analyzer.exe(约 68MB
```
打包配置已优化,排除了 torch、pandas 等无关重量级包。
---
## 运行环境 ## 运行环境
Python 3.10 + numpy, scipy, scikit-image, matplotlib, Pillow - **Python**: `D:\ProgramData\anaconda3\envs\my_env`
- **依赖**: numpy, scipy, scikit-image, matplotlib, Pillow, Flask
---
## 参考文献 ## 参考文献
- 芦碧波等. 低对比度 cDNA 图像分割的局部水平集方法. 中国图象图形学报, 2014. - 芦碧波等. 低对比度 cDNA 图像分割的局部水平集方法. 中国图象图形学报, 2014.
- 芦碧波. 高污染基因芯片图像的网格划分. 河南理工大学学报, 2019. - 芦碧波. 高污染基因芯片图像的网格划分. 河南理工大学学报, 2019.
---
## 仓库
- **首选**(局域网 SSH: `ssh://git@192.168.5.8:2222/Serendipity/cDNA-image-processing.git`
- **备选**(外网 HTTPS: `https://lhy-git.liuhangyv.top/Serendipity/cDNA-image-processing.git`