e21595e72c
- 新增Flask Web应用介绍和三种运行方式 - 新增PyInstaller打包流程 - 更新项目结构,包含web/、build_exe.py等 - 精简两版实现描述,突出各自特点 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
157 lines
4.7 KiB
Markdown
157 lines
4.7 KiB
Markdown
# cDNA 微阵列图像处理作业
|
||
|
||
> 刘航宇 | 河南理工大学计算机学院 | 2026
|
||
|
||
---
|
||
|
||
## 项目概述
|
||
|
||
河南理工大学计算机学院图像处理课程作业。Python 实现 cDNA 微阵列图像的**网格划分**与**阈值分割**,配套 Web 可视化界面和 Windows 可执行文件(exe)。
|
||
|
||
---
|
||
|
||
## 项目结构
|
||
|
||
```
|
||
cDNA微阵列图像处理作业/
|
||
├── src/
|
||
│ ├── cDNA_segmentation.py # 原版:网格划分 + 三种阈值分割 + TV去噪
|
||
│ └── cDNA_gridding_simple.py # 简化版:仅网格划分,用于课堂讲解
|
||
│
|
||
├── web/ # Flask Web 应用
|
||
│ ├── app.py # Flask 主程序
|
||
│ ├── 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
|
||
```
|
||
|
||
---
|
||
|
||
## 快速开始
|
||
|
||
### 方式一: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`(课堂主讲)
|
||
|
||
**算法思路**(初中学历即可理解):
|
||
|
||
```
|
||
1. 灰度图 → 每列/行灰度值求和 → 投影曲线
|
||
2. Otsu 求自适应百分比 = T/255
|
||
3. 阈值 X = (max - min) × 百分比,曲线减去 X
|
||
4. 正 = 斑点,负 = 空隙 → 找过零点 → 配对取中点 → 划线
|
||
5. 逐格 Otsu 分割 + keep_largest_object + remove_small_objects
|
||
```
|
||
|
||
**特点**:
|
||
|
||
- 约 150 行代码,带详细中文注释
|
||
- 核心逻辑仅 30 行
|
||
- 与原版网格线位置误差为 **0 像素**
|
||
- 完全自动化,无需人工设定参数
|
||
|
||
### 原版 `cDNA_segmentation.py`(完整实现)
|
||
|
||
| 模块 | 算法 | 参照 |
|
||
|------|------|------|
|
||
| 网格划分 | 投影 → 自相关 → 白顶帽 → Otsu → 质心 | MATLAB `GriddingAndCV.m` |
|
||
| 阈值分割 | 人工阈值、Otsu 自动阈值、迭代阈值 | — |
|
||
| 去噪 | TV 全变分去噪(Chambolle 投影) | MATLAB `tvdenoise.m` |
|
||
| 后处理 | 去小连通域、保留最大连通域 | MATLAB `choice.m` |
|
||
|
||
---
|
||
|
||
## Web 应用功能
|
||
|
||
- **图像上传**:支持 PNG、JPG、TIFF 等格式,最大 50MB
|
||
- **自动处理**:网格划分 + 逐格分割 + 后处理
|
||
- **6 张可视化图表**:
|
||
1. 网格线叠加原图
|
||
2. 列投影曲线
|
||
3. 行投影曲线
|
||
4. 灰度直方图 + Otsu 阈值
|
||
5. 分割结果(后处理前)
|
||
6. 后处理结果
|
||
- **统计信息**:检测到的斑点数、Otsu 阈值、网格尺寸等
|
||
|
||
---
|
||
|
||
## 输入数据
|
||
|
||
- `cDNA.png`(820×820 RGB,来自 GEO 数据库 GSM16390,Cy3/Cy5 双色荧光)
|
||
- 23×23 斑点阵列,斑点间距约 35px,每斑点约 18px 宽
|
||
|
||
---
|
||
|
||
## 打包说明
|
||
|
||
使用 PyInstaller 将 Web 应用打包为单个 exe 文件:
|
||
|
||
```bash
|
||
python build_exe.py
|
||
# 输出:dist/cDNA_Analyzer.exe(约 68MB)
|
||
```
|
||
|
||
打包配置已优化,排除了 torch、pandas 等无关重量级包。
|
||
|
||
---
|
||
|
||
## 运行环境
|
||
|
||
- **Python**: `D:\ProgramData\anaconda3\envs\my_env`
|
||
- **依赖**: numpy, scipy, scikit-image, matplotlib, Pillow, Flask
|
||
|
||
---
|
||
|
||
## 参考文献
|
||
|
||
- 芦碧波等. 低对比度 cDNA 图像分割的局部水平集方法. 中国图象图形学报, 2014.
|
||
- 芦碧波. 高污染基因芯片图像的网格划分. 河南理工大学学报, 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`
|