# cDNA 微阵列图像处理作业

> **作者**: 刘航宇 | 河南理工大学计算机学院 | 2026

---

## 作业内容

本作业来自《图像处理实例1：cDNA图像分析》，完成以下三个任务：

| 任务 | 内容 | 实现状态 |
|------|------|----------|
| 1 | 分析涉及的图像处理技术 | 见PPTX |
| 2 | 编写阈值分割代码（人工阈值 / 迭代阈值 / Otsu） | `src/cDNA_segmentation.py` |
| 3 | 选取cDNA图像进行分割 | 对cDNA.png完成网格划分+分割 |

---

## 我的Python实现

### 文件结构

```
src/
├── cDNA_segmentation.py      # 原版：完整流程（网格划分 + 阈值分割 + 可视化）
└── cDNA_gridding_simple.py   # 简化版：仅划线，适合课堂讲解

results/           ← 原版输出
results_simple/    ← 简化版输出
```

### 原版 (`cDNA_segmentation.py`)

完整实现，参照MATLAB代码 `NewGridAndCV/`：

| 模块 | 方法 |
|------|------|
| 网格划分 | 投影 → 自相关估间距 → 白顶帽去背景 → Otsu → 质心提取 |
| 阈值分割 | 人工固定阈值、Otsu自动阈值、迭代阈值 |
| 去噪 | TV全变分去噪（Chambolle投影算法） |
| 后处理 | 去小连通域 + 保留最大连通域 |

### 简化版 (`cDNA_gridding_simple.py`)  ★ 课堂主讲

算法3步即可理解，与原版误差为 **0像素**：

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

---

## 运行

```bash
# 原版（需要 numpy, scipy, skimage, PIL, matplotlib）
python src/cDNA_segmentation.py

# 简化版（依赖同上）
python src/cDNA_gridding_simple.py
```

Python 环境：`my_env`（Anaconda），路径 `D:\ProgramData\anaconda3\envs\my_env`

---

## 参考资料

### 参考论文

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

### MATLAB参考代码

`参考资料/NewGridAndCV/` — MathWorks官方示例改编版，含网格划分与Chan-Vese水平集分割。

### 数据来源

`cDNA图像处理实例/数据/cDNA/` — 源自GEO数据库（GSM16390），Cy3/Cy5双通道荧光标记。

---

## 结果对比

| | 原版（自相关+白顶帽） | 简化版（投影+阈值+过零点） |
|---|---|---|
| 算法复杂度 | 高（须懂自相关/形态学） | 低（加减乘除即可理解） |
| 网格线数量 | 22×22 | 22×22 |
| 线条位置 | 42, 77, 112, … | 42, 77, 112, … |
| 误差 | — | **0像素** |

简化版虽算法极简，但精度与原版完全一致，非常适合课堂讲解和教学演示。
