# 简化版 vs 原版 差异说明

> 写给以后的自己：简化版只是课堂演示用的，生产环境用原版。

---

## 一句话总结

| | 功能 | 用途 |
|---|---|---|
| 简化版 | 只画网格线 | 课堂讲解 |
| 原版 | 网格 + 去噪 + 分割 + 后处理 + 可视化 | 完整作业 |

---

## 简化版缺少的模块

### 1. TV全变分去噪

**位置**：`cDNA_segmentation.py` 第 78-102 行，`tv_denoise()`

**干什么**：对每个子块做 Chambolle 投影去噪，去除荧光噪点。简化版完全没有这一步。

**实现**：Rudin-Osher-Fatemi 模型，`min TV(u) + λ/2||f-u||²`，迭代对偶变量 p1、p2 直到收敛。

### 2. 三种阈值分割

**位置**：`cDNA_segmentation.py` 第 35-71 行

| 函数 | 原理 |
|------|------|
| `manual_threshold()` | 灰度 > 固定值 T |
| `otsu_threshold()` | 最大类间方差自动求 T |
| `iterative_threshold()` | 初始 T=均值，迭代 T=(μ_fg+μ_bg)/2 直到收敛 |

简化版完全没有分割这一步。

### 3. 全图逐块分割

**位置**：`cDNA_segmentation.py` 第 374-411 行

**做什么**：对网格划分出的每个子块：
1. 如果太暗（均值<5或<30），先增强
2. TV 去噪
3. Otsu 阈值二值化
4. 保留最大连通域
5. 拼接回全局二值图

简化版只画线，不处理子块。

### 4. 后处理

**位置**：`cDNA_segmentation.py` 第 206-226 行

| 函数 | 作用 |
|------|------|
| `remove_small_objects()` | 去掉面积 < 20 的连通域（噪声） |
| `keep_largest_object()` | 每个子块只保留最大的那块（斑点） |

简化版不需要后处理（因为没生成二值图）。

### 5. 可视化差异

**简化版输出**（1张）：

| 文件 | 内容 |
|------|------|
| `gridding_simple.png` | 灰度图 + 绿色网格线 |

**原版输出**（6张）：

| 文件 | 内容 |
|------|------|
| `result_gridding.png` | 4合1：网格叠加 + 列投影 + 行投影 + 灰度直方图 |
| `result_gridding_overlay.png` | 网格线叠在原图上 |
| `result_threshold_compare.png` | 2×2：原图 + 人工/Otsu/迭代三种分割对比 |
| `result_iterative_convergence.png` | 迭代阈值收敛曲线 |
| `result_full_segmentation.png` | 全图逐块分割二值结果 |
| `result_I_bw.png` | 单独的二值图 |

### 6. 网格划分算法不同

| 步骤 | 简化版 | 原版 |
|------|--------|------|
| 投影 | `np.sum` 求和 | `np.mean` 求均值 |
| 估间距 | 无 | 自相关 `np.correlate` |
| 去背景 | 无 | `ndimage.white_tophat` |
| 找斑点 | 减10%阈值 → 过零点 | Otsu + 连通域质心 |

结果一致（误差 0 像素），但算法完全不同。

---

## 什么时候用哪个

| 场景 | 用哪个 |
|------|--------|
| 课堂讲算法思路 | 简化版 |
| 实际做图像处理 | 原版 |
| 对比阈值方法对同一张图的效果 | 原版 |
| 只画网格线 | 都可以 |
