# cDNA 微阵列图像处理作业

> 刘航宇 | 河南理工大学计算机学院 | 2026
> 
---

## 项目结构

```
src/
├── cDNA_segmentation.py          # 原版：网格划分 + 三种阈值分割 + TV去噪
└── cDNA_gridding_simple.py       # 简化版：仅网格划分，用于课堂讲解

results/                          # 原版输出（6张PNG）
results_simple/                   # 简化版输出（网格叠加图 + 流程图）
docs/
└── gridding_simple_tutorial.md   # 简化版逐行代码讲解教程
```

---

## 两个Python实现

### 简化版 `cDNA_gridding_simple.py`（课堂主讲）

**算法思路**（初中学历即可理解）：

```
1. 灰度图 → 每列/行灰度值求和 → 投影曲线
2. 阈值 X = (max - min) × 10%，曲线减去 X
3. 正 = 斑点，负 = 空隙 → 找过零点 → 配对取中点 → 划线
```

**运行**：

```bash
cd src
python cDNA_gridding_simple.py
# 输出：results_simple/gridding_simple.png
```

**特点**：

- 约 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 |
| 代码行数 | 150 | 430 |
| 检测网格线数 | 22×22 | 22×22 |
| 线条位置 | 42, 77, 112, … | 42, 77, 112, … |
| **误差** | **0 像素** | — |

---

## 技术文档

- `docs/gridding_simple_tutorial.md` — 简化版 190 行逐行讲解，含 ASCII 图解
- `results_simple/flowchart.drawio` — 算法流程图，用 Draw.io 打开

## 输入数据

`cDNA.png`（820×820 RGB，来自 GEO 数据库 GSM16390，Cy3/Cy5 双色荧光）

## 运行环境

Python 3.10 + numpy, scipy, scikit-image, matplotlib, Pillow

## 参考文献

- 芦碧波等. 低对比度 cDNA 图像分割的局部水平集方法. 中国图象图形学报, 2014.
- 芦碧波. 高污染基因芯片图像的网格划分. 河南理工大学学报, 2019.
