# 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.