From e21595e72c2bb79b2d296f1abfe7f92213d49dd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E8=88=AA=E5=AE=87?= <3364451258@qq.com> Date: Fri, 8 May 2026 21:41:03 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0README=EF=BC=8C?= =?UTF-8?q?=E6=96=B0=E5=A2=9EWeb=E5=BA=94=E7=94=A8=E5=92=8C=E6=89=93?= =?UTF-8?q?=E5=8C=85=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增Flask Web应用介绍和三种运行方式 - 新增PyInstaller打包流程 - 更新项目结构,包含web/、build_exe.py等 - 精简两版实现描述,突出各自特点 Co-Authored-By: Claude Opus 4.7 --- README.md | 172 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 109 insertions(+), 63 deletions(-) diff --git a/README.md b/README.md index 5d673cc..a149a8a 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,75 @@ # cDNA 微阵列图像处理作业 > 刘航宇 | 河南理工大学计算机学院 | 2026 -> + +--- + +## 项目概述 + +河南理工大学计算机学院图像处理课程作业。Python 实现 cDNA 微阵列图像的**网格划分**与**阈值分割**,配套 Web 可视化界面和 Windows 可执行文件(exe)。 + --- ## 项目结构 ``` -src/ -├── cDNA_segmentation.py # 原版:网格划分 + 三种阈值分割 + TV去噪 -└── cDNA_gridding_simple.py # 简化版:仅网格划分,用于课堂讲解 - -results/ # 原版输出(6张PNG) -results_simple/ # 简化版输出(网格叠加图 + 流程图) -docs/ -└── gridding_simple_tutorial.md # 简化版逐行代码讲解教程 +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 ``` --- -## 两个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`(课堂主讲) @@ -27,16 +77,10 @@ docs/ ``` 1. 灰度图 → 每列/行灰度值求和 → 投影曲线 -2. 阈值 X = (max - min) × 10%,曲线减去 X -3. 正 = 斑点,负 = 空隙 → 找过零点 → 配对取中点 → 划线 -``` - -**运行**: - -```bash -cd src -python cDNA_gridding_simple.py -# 输出:results_simple/gridding_simple.png +2. Otsu 求自适应百分比 = T/255 +3. 阈值 X = (max - min) × 百分比,曲线减去 X +4. 正 = 斑点,负 = 空隙 → 找过零点 → 配对取中点 → 划线 +5. 逐格 Otsu 分割 + keep_largest_object + remove_small_objects ``` **特点**: @@ -44,67 +88,69 @@ python cDNA_gridding_simple.py - 约 150 行代码,带详细中文注释 - 核心逻辑仅 30 行 - 与原版网格线位置误差为 **0 像素** -- `find_gap_lines` 函数:减阈值 → 判断正负 → 找过零点 → 配对空隙中点 +- 完全自动化,无需人工设定参数 ### 原版 `cDNA_segmentation.py`(完整实现) -**包含模块**: - -| 模块 | 算法 | 依赖 | +| 模块 | 算法 | 参照 | |------|------|------| -| 网格划分 | 投影 → 自相关 → 白顶帽 → Otsu → 质心 | numpy, scipy, skimage | -| 阈值分割 | 人工阈值、Otsu 自动阈值、迭代阈值 | 同上 | -| 去噪 | TV 全变分去噪(Chambolle 投影) | 同上 | -| 后处理 | 去小连通域、保留最大连通域 | 同上 | - -**运行**: - -```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` | 最终二值图 | +| 网格划分 | 投影 → 自相关 → 白顶帽 → Otsu → 质心 | MATLAB `GriddingAndCV.m` | +| 阈值分割 | 人工阈值、Otsu 自动阈值、迭代阈值 | — | +| 去噪 | TV 全变分去噪(Chambolle 投影) | MATLAB `tvdenoise.m` | +| 后处理 | 去小连通域、保留最大连通域 | MATLAB `choice.m` | --- -## 两版对比 +## Web 应用功能 -| | 简化版 | 原版 | -|---|---|---| -| 功能 | 仅画网格线 | 网格 + 分割 + 去噪 | -| 核心算法 | 加减乘除 | 自相关 + 形态学 + Otsu | -| 代码行数 | 150 | 430 | -| 检测网格线数 | 22×22 | 22×22 | -| 线条位置 | 42, 77, 112, … | 42, 77, 112, … | -| **误差** | **0 像素** | — | +- **图像上传**:支持 PNG、JPG、TIFF 等格式,最大 50MB +- **自动处理**:网格划分 + 逐格分割 + 后处理 +- **6 张可视化图表**: + 1. 网格线叠加原图 + 2. 列投影曲线 + 3. 行投影曲线 + 4. 灰度直方图 + Otsu 阈值 + 5. 分割结果(后处理前) + 6. 后处理结果 +- **统计信息**:检测到的斑点数、Otsu 阈值、网格尺寸等 --- -## 技术文档 - -- `docs/gridding_simple_tutorial.md` — 简化版 190 行逐行讲解,含 ASCII 图解 -- `results_simple/flowchart.drawio` — 算法流程图,用 Draw.io 打开 - ## 输入数据 -`cDNA.png`(820×820 RGB,来自 GEO 数据库 GSM16390,Cy3/Cy5 双色荧光) +- `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 3.10 + numpy, scipy, scikit-image, matplotlib, Pillow +- **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`