refactor: 项目目录结构重组
- 中文目录名改为英文:cDNA图像处理实例→examples,参考资料→references - web→app(Flask应用标准命名) - 输出目录平移到 data/output/simple/ 和 data/output/full/ - 输入图像统一到 data/input/ - 构建脚本移到 scripts/ - 源码文件改用 snake_case 命名 - 更新所有文件路径引用和文档
@@ -8,6 +8,7 @@
|
|||||||
# Python
|
# Python
|
||||||
__pycache__/
|
__pycache__/
|
||||||
*.pyc
|
*.pyc
|
||||||
|
.venv/
|
||||||
|
|
||||||
# OS
|
# OS
|
||||||
.DS_Store
|
.DS_Store
|
||||||
@@ -18,6 +19,7 @@ Thumbs.db
|
|||||||
|
|
||||||
# Flask
|
# Flask
|
||||||
.playwright-mcp/
|
.playwright-mcp/
|
||||||
|
app/uploads/
|
||||||
|
|
||||||
# PyInstaller 打包产物
|
# PyInstaller 打包产物
|
||||||
dist/
|
dist/
|
||||||
|
|||||||
@@ -8,30 +8,37 @@
|
|||||||
|
|
||||||
```
|
```
|
||||||
src/
|
src/
|
||||||
├── cDNA_segmentation.py ← 原版:完整处理流程
|
├── segmentation.py ← 原版:完整处理流程
|
||||||
└── cDNA_gridding_simple.py ← 简化版:仅划线,用于课堂讲解 ★
|
└── gridding_simple.py ← 简化版:仅划线,用于课堂讲解 ★
|
||||||
|
|
||||||
results/ ← 原版输出(6张图)
|
app/ ← Flask Web应用
|
||||||
results_simple/ ← 简化版输出(1张图)
|
scripts/ ← 构建脚本
|
||||||
|
data/
|
||||||
|
├── input/ ← 输入图像
|
||||||
|
└── output/
|
||||||
|
├── simple/ ← 简化版输出(6张图)
|
||||||
|
└── full/ ← 原版输出(6张图)
|
||||||
|
|
||||||
cDNA图像处理实例/数据/cDNA/ ← 输入图像 + MATLAB示例
|
examples/数据/cDNA/ ← 课程原始数据 + MATLAB示例
|
||||||
参考资料/NewGridAndCV/ ← MATLAB参考实现
|
references/matlab/ ← MATLAB参考实现
|
||||||
|
references/papers/ ← 论文PDF
|
||||||
```
|
```
|
||||||
|
|
||||||
## 两个Python实现
|
## 两个Python实现
|
||||||
|
|
||||||
### 简化版 (`cDNA_gridding_simple.py`) — 课堂主讲
|
### 简化版 (`src/gridding_simple.py`) — 课堂主讲
|
||||||
|
|
||||||
- 算法:投影求和 → (max-min)×10%阈值 → 过零点配对 → 划线
|
- 算法:投影求和 → (max-min)×10%阈值 → 过零点配对 → 划线
|
||||||
- 约150行,带详细中文注释,适合课堂讲解
|
- 约370行,带详细中文注释,适合课堂讲解
|
||||||
- 输出:`results_simple/gridding_simple.png`
|
- 输出:`data/output/simple/` 下 6 张图
|
||||||
- **与原版网格线位置完全一致(误差0像素)**
|
- **与原版网格线位置完全一致(误差0像素)**
|
||||||
|
|
||||||
### 原版 (`cDNA_segmentation.py`) — 完整实现
|
### 原版 (`src/segmentation.py`) — 完整实现
|
||||||
|
|
||||||
- 网格划分:自相关+白顶帽+Otsu+质心(参照MATLAB `GriddingAndCV.m`)
|
- 网格划分:自相关+白顶帽+Otsu+质心(参照MATLAB `GriddingAndCV.m`)
|
||||||
- 三种阈值分割:人工阈值、Otsu、迭代阈值
|
- 三种阈值分割:人工阈值、Otsu、迭代阈值
|
||||||
- TV去噪(Chambolle投影算法,参照 `tvdenoise.m`)
|
- TV去噪(Chambolle投影算法,参照 `tvdenoise.m`)
|
||||||
|
- 输出:`data/output/full/` 下 6 张图
|
||||||
|
|
||||||
## 算法要点
|
## 算法要点
|
||||||
|
|
||||||
@@ -44,6 +51,7 @@ cDNA图像处理实例/数据/cDNA/ ← 输入图像 + MATLAB示例
|
|||||||
|
|
||||||
- `cDNA.png`:820×820 RGB,23×23斑点阵列,Cy3/Cy5双色荧光
|
- `cDNA.png`:820×820 RGB,23×23斑点阵列,Cy3/Cy5双色荧光
|
||||||
- 斑点间距约35px,每斑点约18px宽
|
- 斑点间距约35px,每斑点约18px宽
|
||||||
|
- 输入路径:`data/input/cDNA.png`
|
||||||
|
|
||||||
## 编码规范
|
## 编码规范
|
||||||
|
|
||||||
@@ -52,8 +60,10 @@ cDNA图像处理实例/数据/cDNA/ ← 输入图像 + MATLAB示例
|
|||||||
|
|
||||||
## 运行环境
|
## 运行环境
|
||||||
|
|
||||||
Python:`D:\ProgramData\anaconda3\envs\my_env`
|
Python虚拟环境:项目根目录 `.venv/`(uv 创建,Python 3.13)
|
||||||
依赖:numpy, scipy, scikit-image, matplotlib, Pillow
|
依赖:numpy, scipy, scikit-image, matplotlib, Pillow, flask
|
||||||
|
|
||||||
|
安装:`uv pip install numpy scipy scikit-image matplotlib Pillow flask --python .venv/Scripts/python.exe`
|
||||||
|
|
||||||
## 仓库
|
## 仓库
|
||||||
|
|
||||||
|
|||||||
@@ -15,28 +15,38 @@
|
|||||||
```
|
```
|
||||||
cDNA微阵列图像处理作业/
|
cDNA微阵列图像处理作业/
|
||||||
├── src/
|
├── src/
|
||||||
│ ├── cDNA_segmentation.py # 原版:网格划分 + 三种阈值分割 + TV去噪
|
│ ├── segmentation.py # 原版:网格划分 + 三种阈值分割 + TV去噪
|
||||||
│ └── cDNA_gridding_simple.py # 简化版:仅网格划分,用于课堂讲解
|
│ └── gridding_simple.py # 简化版:仅网格划分,用于课堂讲解
|
||||||
│
|
│
|
||||||
├── web/ # Flask Web 应用
|
├── app/ # Flask Web 应用
|
||||||
│ ├── app.py # Flask 主程序
|
│ ├── main.py # Flask 主程序
|
||||||
│ ├── launcher.py # PyInstaller 打包入口
|
│ ├── launcher.py # PyInstaller 打包入口
|
||||||
│ ├── templates/index.html # 前端页面
|
│ ├── templates/index.html # 前端页面
|
||||||
│ └── static/style.css # 样式文件
|
│ └── static/style.css # 样式文件
|
||||||
│
|
│
|
||||||
├── build_exe.py # PyInstaller 打包脚本
|
├── scripts/
|
||||||
├── cDNA_Analyzer.spec # PyInstaller spec 配置
|
│ └── build.py # PyInstaller 打包脚本
|
||||||
├── flowchart.drawio # 算法流程图(用 Draw.io 打开)
|
│
|
||||||
|
├── data/
|
||||||
|
│ ├── input/ # 输入图像
|
||||||
|
│ │ └── cDNA.png
|
||||||
|
│ └── output/ # 生成结果
|
||||||
|
│ ├── simple/ # 简化版输出(6张图)
|
||||||
|
│ └── full/ # 原版输出(6张图)
|
||||||
|
│
|
||||||
|
├── examples/ # 课程示例数据(含 pptx + MATLAB demo)
|
||||||
|
├── references/ # 参考资料
|
||||||
|
│ ├── papers/ # 论文 PDF
|
||||||
|
│ └── matlab/ # MATLAB 参考代码(NewGridAndCV)
|
||||||
│
|
│
|
||||||
├── results/ # 原版输出图像(6张)
|
|
||||||
├── results_simple/ # 简化版输出图像(6张)
|
|
||||||
├── docs/ # 技术文档
|
├── docs/ # 技术文档
|
||||||
│ ├── cDNA 微阵列网格划分.md # 算法详解
|
│ ├── cDNA 微阵列网格划分.md
|
||||||
│ ├── 两版差异说明.md # 简化版 vs 原版对比
|
│ ├── 两版差异说明.md
|
||||||
│ └── 依赖库清单.md # Python 依赖
|
│ └── 依赖库清单.md
|
||||||
│
|
│
|
||||||
├── cDNA图像处理实例/ # 课程示例数据
|
├── flowchart.drawio # 算法流程图
|
||||||
└── 参考资料/ # MATLAB 参考代码 + 论文 PDF
|
├── README.md
|
||||||
|
└── CLAUDE.md
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -50,28 +60,33 @@ cDNA微阵列图像处理作业/
|
|||||||
### 方式二:Web 开发模式
|
### 方式二:Web 开发模式
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd web
|
# 首次使用需创建虚拟环境
|
||||||
python app.py
|
uv venv .venv --python <你的Python路径>
|
||||||
|
uv pip install numpy scipy scikit-image matplotlib Pillow flask --python .venv/Scripts/python.exe
|
||||||
|
|
||||||
|
# 启动
|
||||||
|
cd app
|
||||||
|
python main.py
|
||||||
# 浏览器自动打开 http://localhost:5000
|
# 浏览器自动打开 http://localhost:5000
|
||||||
```
|
```
|
||||||
|
|
||||||
### 方式三:命令行脚本
|
### 方式三:命令行脚本
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 简化版(课堂主讲,约150行)
|
# 简化版(课堂主讲,约370行)
|
||||||
python src/cDNA_gridding_simple.py
|
python src/gridding_simple.py
|
||||||
# 输出:results_simple/ 下 6 张图
|
# 输出:data/output/simple/ 下 6 张图
|
||||||
|
|
||||||
# 原版(完整实现,430行)
|
# 原版(完整实现,约470行)
|
||||||
python src/cDNA_segmentation.py
|
python src/segmentation.py
|
||||||
# 输出:results/ 下 6 张图
|
# 输出:data/output/full/ 下 6 张图
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 两种 Python 实现
|
## 两种 Python 实现
|
||||||
|
|
||||||
### 简化版 `cDNA_gridding_simple.py`(课堂主讲)
|
### 简化版 `src/gridding_simple.py`(课堂主讲)
|
||||||
|
|
||||||
**算法思路**(初中学历即可理解):
|
**算法思路**(初中学历即可理解):
|
||||||
|
|
||||||
@@ -85,12 +100,12 @@ python src/cDNA_segmentation.py
|
|||||||
|
|
||||||
**特点**:
|
**特点**:
|
||||||
|
|
||||||
- 约 150 行代码,带详细中文注释
|
- 约 370 行代码,带详细中文注释
|
||||||
- 核心逻辑仅 30 行
|
- 核心逻辑仅 30 行
|
||||||
- 与原版网格线位置误差为 **0 像素**
|
- 与原版网格线位置误差为 **0 像素**
|
||||||
- 完全自动化,无需人工设定参数
|
- 完全自动化,无需人工设定参数
|
||||||
|
|
||||||
### 原版 `cDNA_segmentation.py`(完整实现)
|
### 原版 `src/segmentation.py`(完整实现)
|
||||||
|
|
||||||
| 模块 | 算法 | 参照 |
|
| 模块 | 算法 | 参照 |
|
||||||
|------|------|------|
|
|------|------|------|
|
||||||
@@ -128,7 +143,7 @@ python src/cDNA_segmentation.py
|
|||||||
使用 PyInstaller 将 Web 应用打包为单个 exe 文件:
|
使用 PyInstaller 将 Web 应用打包为单个 exe 文件:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python build_exe.py
|
python scripts/build.py
|
||||||
# 输出:dist/cDNA_Analyzer.exe(约 68MB)
|
# 输出:dist/cDNA_Analyzer.exe(约 68MB)
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -138,7 +153,7 @@ python build_exe.py
|
|||||||
|
|
||||||
## 运行环境
|
## 运行环境
|
||||||
|
|
||||||
- **Python**: `D:\ProgramData\anaconda3\envs\my_env`
|
- **Python**: 3.13(uv 虚拟环境 `.venv/`)
|
||||||
- **依赖**: numpy, scipy, scikit-image, matplotlib, Pillow, Flask
|
- **依赖**: numpy, scipy, scikit-image, matplotlib, Pillow, Flask
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ os.environ['TEMPLATE_DIR'] = os.path.join(base, 'templates')
|
|||||||
os.environ['STATIC_DIR'] = os.path.join(base, 'static')
|
os.environ['STATIC_DIR'] = os.path.join(base, 'static')
|
||||||
|
|
||||||
# 导入 Flask app
|
# 导入 Flask app
|
||||||
from app import app
|
from main import app
|
||||||
|
|
||||||
def open_browser():
|
def open_browser():
|
||||||
os.startfile('http://localhost:5000')
|
os.startfile('http://localhost:5000')
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
"""
|
"""
|
||||||
cDNA微阵列图像处理 - Web UI (Flask)
|
cDNA微阵列图像处理 - Web UI (Flask)
|
||||||
=====================================
|
=====================================
|
||||||
启动:python web/app.py
|
启动:python app/main.py
|
||||||
打包:python build_exe.py
|
打包:python scripts/build.py
|
||||||
打开:http://localhost:5000
|
打开:http://localhost:5000
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
Before Width: | Height: | Size: 101 KiB After Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
|
After Width: | Height: | Size: 266 KiB |
|
After Width: | Height: | Size: 286 KiB |
|
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 89 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 199 KiB |
|
After Width: | Height: | Size: 87 KiB |
|
After Width: | Height: | Size: 79 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 101 KiB |
|
After Width: | Height: | Size: 101 KiB |
@@ -102,9 +102,9 @@ plt.rcParams['axes.unicode_minus'] = False # 第 27 行
|
|||||||
```python
|
```python
|
||||||
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) # 第 30 行
|
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) # 第 30 行
|
||||||
BASE_DIR = os.path.dirname(SCRIPT_DIR) # 第 31 行
|
BASE_DIR = os.path.dirname(SCRIPT_DIR) # 第 31 行
|
||||||
DATA_DIR = os.path.join(BASE_DIR, 'cDNA图像处理实例', # 第 32 行
|
DATA_DIR = os.path.join(BASE_DIR, 'data', 'input') # 第 32 行
|
||||||
'数据', 'cDNA')
|
'数据', 'cDNA')
|
||||||
OUTPUT_DIR = os.path.join(BASE_DIR, 'results_simple') # 第 33 行
|
OUTPUT_DIR = os.path.join(BASE_DIR, 'data', 'output', 'simple')
|
||||||
```
|
```
|
||||||
|
|
||||||
这 4 行在设置**相对路径常量**,保证脚本不管从哪个目录运行都能找到正确的文件。
|
这 4 行在设置**相对路径常量**,保证脚本不管从哪个目录运行都能找到正确的文件。
|
||||||
@@ -116,14 +116,14 @@ OUTPUT_DIR = os.path.join(BASE_DIR, 'results_simple') # 第 33 行
|
|||||||
| `os.path.dirname(...)` | 去掉文件名,只留目录 | `D:/.../src` |
|
| `os.path.dirname(...)` | 去掉文件名,只留目录 | `D:/.../src` |
|
||||||
| `SCRIPT_DIR` | 脚本所在目录 | `.../src` |
|
| `SCRIPT_DIR` | 脚本所在目录 | `.../src` |
|
||||||
| `BASE_DIR` | 项目根目录(上级) | `.../cDNA微阵列图像处理作业` |
|
| `BASE_DIR` | 项目根目录(上级) | `.../cDNA微阵列图像处理作业` |
|
||||||
| `DATA_DIR` | 输入图像所在目录 | `.../cDNA图像处理实例/数据/cDNA` |
|
| `DATA_DIR` | 输入图像所在目录 | `.../data/input` |
|
||||||
| `OUTPUT_DIR` | 输出图像保存目录 | `.../results_simple` |
|
| `OUTPUT_DIR` | 输出图像保存目录 | `.../data/output/simple` |
|
||||||
| | | |
|
| | | |
|
||||||
|
|
||||||
`os.sep.join(A, B, C)` 会把 A、B、C 用系统的路径分隔符(Windows 是 `\`)拼起来:
|
`os.sep.join(A, B, C)` 会把 A、B、C 用系统的路径分隔符(Windows 是 `\`)拼起来:
|
||||||
```
|
```
|
||||||
BASE_DIR + 'cDNA图像处理实例' + '数据' + 'cDNA'
|
BASE_DIR + 'data' + 'input'
|
||||||
→ '.../cDNA微阵列图像处理作业/cDNA图像处理实例/数据/cDNA'
|
→ '.../cDNA微阵列图像处理作业/data/input'
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -523,6 +523,6 @@ Python 的习惯写法。
|
|||||||
## 课堂演示建议
|
## 课堂演示建议
|
||||||
|
|
||||||
1. 先在 PPT 上展示算法步骤的 6 步流程图
|
1. 先在 PPT 上展示算法步骤的 6 步流程图
|
||||||
2. 投影曲线的图片可以直接从 `results_simple/gridding_simple.png` 截取
|
2. 投影曲线的图片可以直接从 `data/output/simple/01_grid_overlay.png` 截取
|
||||||
3. 重点讲清楚第 130~136 行"为什么从第一个 +→- 开始配对",这是最容易出错的地方
|
3. 重点讲清楚第 130~136 行"为什么从第一个 +→- 开始配对",这是最容易出错的地方
|
||||||
4. 如果有投影仪,可以现场改 `pct` 参数值(改成 0.05、0.20),让学生看到阈值怎么影响结果
|
4. 如果有投影仪,可以现场改 `pct` 参数值(改成 0.05、0.20),让学生看到阈值怎么影响结果
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
| | 功能 | 用途 |
|
| | 功能 | 用途 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 简化版 | 只画网格线 | 课堂讲解 |
|
| 简化版 | 只画网格线+逐格分割 | 课堂讲解 |
|
||||||
| 原版 | 网格 + 去噪 + 分割 + 后处理 + 可视化 | 完整作业 |
|
| 原版 | 网格 + 去噪 + 分割 + 后处理 + 可视化 | 完整作业 |
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
### 1. TV全变分去噪
|
### 1. TV全变分去噪
|
||||||
|
|
||||||
**位置**:`cDNA_segmentation.py` 第 78-102 行,`tv_denoise()`
|
**位置**:`src/segmentation.py` 第 78-102 行,`tv_denoise()`
|
||||||
|
|
||||||
**干什么**:对每个子块做 Chambolle 投影去噪,去除荧光噪点。简化版完全没有这一步。
|
**干什么**:对每个子块做 Chambolle 投影去噪,去除荧光噪点。简化版完全没有这一步。
|
||||||
|
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
### 2. 三种阈值分割
|
### 2. 三种阈值分割
|
||||||
|
|
||||||
**位置**:`cDNA_segmentation.py` 第 35-71 行
|
**位置**:`src/segmentation.py` 第 35-71 行
|
||||||
|
|
||||||
| 函数 | 原理 |
|
| 函数 | 原理 |
|
||||||
|------|------|
|
|------|------|
|
||||||
@@ -37,7 +37,7 @@
|
|||||||
|
|
||||||
### 3. 全图逐块分割
|
### 3. 全图逐块分割
|
||||||
|
|
||||||
**位置**:`cDNA_segmentation.py` 第 374-411 行
|
**位置**:`src/segmentation.py` 第 397-434 行(逐块分割主循环)
|
||||||
|
|
||||||
**做什么**:对网格划分出的每个子块:
|
**做什么**:对网格划分出的每个子块:
|
||||||
1. 如果太暗(均值<5或<30),先增强
|
1. 如果太暗(均值<5或<30),先增强
|
||||||
@@ -50,7 +50,7 @@
|
|||||||
|
|
||||||
### 4. 后处理
|
### 4. 后处理
|
||||||
|
|
||||||
**位置**:`cDNA_segmentation.py` 第 206-226 行
|
**位置**:`src/segmentation.py` 第 206-249 行
|
||||||
|
|
||||||
| 函数 | 作用 |
|
| 函数 | 作用 |
|
||||||
|------|------|
|
|------|------|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
| **scikit-image** | 0.25.2 | `rgb2gray` 灰度转换、Otsu 阈值 | 全部 .py |
|
| **scikit-image** | 0.25.2 | `rgb2gray` 灰度转换、Otsu 阈值 | 全部 .py |
|
||||||
| **matplotlib** | 3.10.8 | 可视化绘图(投影曲线、直方图、结果图) | 全部 .py |
|
| **matplotlib** | 3.10.8 | 可视化绘图(投影曲线、直方图、结果图) | 全部 .py |
|
||||||
| **Pillow** | 12.1.1 | 读取图像文件(png/tif/jpg) | 全部 .py |
|
| **Pillow** | 12.1.1 | 读取图像文件(png/tif/jpg) | 全部 .py |
|
||||||
| **Flask** | 3.1.2 | Web 后端 | web/app.py |
|
| **Flask** | 3.1.2 | Web 后端 | app/main.py |
|
||||||
|
|
||||||
## 仅打包时需要的额外依赖
|
## 仅打包时需要的额外依赖
|
||||||
|
|
||||||
@@ -20,17 +20,17 @@
|
|||||||
## 安装命令
|
## 安装命令
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pip install numpy scipy scikit-image matplotlib Pillow flask
|
uv pip install numpy scipy scikit-image matplotlib Pillow flask --python .venv/Scripts/python.exe
|
||||||
```
|
```
|
||||||
|
|
||||||
如需打包:
|
如需打包:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pip install pyinstaller
|
uv pip install pyinstaller --python .venv/Scripts/python.exe
|
||||||
python build_exe.py
|
python scripts/build.py
|
||||||
```
|
```
|
||||||
|
|
||||||
## 版本兼容性
|
## 版本兼容性
|
||||||
|
|
||||||
以上版本为当前开发环境(Python 3.10,Anaconda `my_env`)实测版本。
|
以上版本为当前开发环境(Python 3.13,uv 虚拟环境 `.venv/`)实测版本。
|
||||||
其他相近版本通常兼容,无特殊版本锁定需求。
|
其他相近版本通常兼容,无特殊版本锁定需求。
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 100 KiB |
|
Before Width: | Height: | Size: 101 KiB After Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 3.1 MiB After Width: | Height: | Size: 3.1 MiB |
|
After Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 8.9 KiB |
|
Before Width: | Height: | Size: 257 KiB After Width: | Height: | Size: 257 KiB |
|
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 87 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 6.8 KiB |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 110 KiB After Width: | Height: | Size: 110 KiB |
|
Before Width: | Height: | Size: 124 KiB After Width: | Height: | Size: 124 KiB |
|
Before Width: | Height: | Size: 126 KiB After Width: | Height: | Size: 126 KiB |
|
Before Width: | Height: | Size: 143 KiB After Width: | Height: | Size: 143 KiB |
|
Before Width: | Height: | Size: 270 KiB |
|
Before Width: | Height: | Size: 291 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 200 KiB |
|
Before Width: | Height: | Size: 89 KiB |
|
Before Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 104 KiB |
|
Before Width: | Height: | Size: 104 KiB |
|
Before Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 142 KiB |
|
Before Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 7.5 KiB |
|
Before Width: | Height: | Size: 8.4 KiB |
@@ -1,6 +1,6 @@
|
|||||||
"""
|
"""
|
||||||
PyInstaller打包脚本
|
PyInstaller打包脚本
|
||||||
运行: python build_exe.py
|
运行: python scripts/build.py
|
||||||
输出: dist/cDNA_Analyzer.exe
|
输出: dist/cDNA_Analyzer.exe
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@@ -8,12 +8,12 @@ import PyInstaller.__main__
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
PyInstaller.__main__.run([
|
PyInstaller.__main__.run([
|
||||||
'web/launcher.py',
|
'app/launcher.py',
|
||||||
'--name=cDNA_Analyzer',
|
'--name=cDNA_Analyzer',
|
||||||
'--onefile',
|
'--onefile',
|
||||||
'--noconsole',
|
'--noconsole',
|
||||||
'--add-data', f'web/templates;templates',
|
'--add-data', f'app/templates;templates',
|
||||||
'--add-data', f'web/static;static',
|
'--add-data', f'app/static;static',
|
||||||
# 排除不相关的重量级包(环境里有torch/pandas等)
|
# 排除不相关的重量级包(环境里有torch/pandas等)
|
||||||
'--exclude-module', 'torch',
|
'--exclude-module', 'torch',
|
||||||
'--exclude-module', 'torchvision',
|
'--exclude-module', 'torchvision',
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
cDNA微阵列图像处理 —— 简化版
|
cDNA微阵列图像处理 —— 简化版
|
||||||
======================================
|
======================================
|
||||||
|
|
||||||
D:\ProgramData\anaconda3\envs\my_env\python.exe src/cDNA_gridding_simple.py
|
.venv\Scripts\python.exe src/gridding_simple.py
|
||||||
|
|
||||||
一、算法流程总览
|
一、算法流程总览
|
||||||
|
|
||||||
@@ -56,8 +56,8 @@ plt.rcParams['axes.unicode_minus'] = False
|
|||||||
# 路径设置(从脚本位置动态推导,禁止硬编码绝对路径)
|
# 路径设置(从脚本位置动态推导,禁止硬编码绝对路径)
|
||||||
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||||
BASE_DIR = os.path.dirname(SCRIPT_DIR)
|
BASE_DIR = os.path.dirname(SCRIPT_DIR)
|
||||||
DATA_DIR = os.path.join(BASE_DIR, 'cDNA图像处理实例', '数据', 'cDNA')
|
DATA_DIR = os.path.join(BASE_DIR, 'data', 'input')
|
||||||
OUTPUT_DIR = os.path.join(BASE_DIR, 'results_simple')
|
OUTPUT_DIR = os.path.join(BASE_DIR, 'data', 'output', 'simple')
|
||||||
|
|
||||||
|
|
||||||
# ================================================================
|
# ================================================================
|
||||||
@@ -24,8 +24,8 @@ rcParams['axes.unicode_minus'] = False
|
|||||||
# 路径配置(使用脚本位置向上两级作为基准)
|
# 路径配置(使用脚本位置向上两级作为基准)
|
||||||
_SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
_SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||||
_BASE_DIR = os.path.dirname(_SCRIPT_DIR) # 项目根目录
|
_BASE_DIR = os.path.dirname(_SCRIPT_DIR) # 项目根目录
|
||||||
DATA_DIR = os.path.join(_BASE_DIR, 'cDNA图像处理实例', '数据', 'cDNA')
|
DATA_DIR = os.path.join(_BASE_DIR, 'data', 'input')
|
||||||
OUTPUT_DIR = os.path.join(_BASE_DIR, 'results')
|
OUTPUT_DIR = os.path.join(_BASE_DIR, 'data', 'output', 'full')
|
||||||
|
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||