docs: 重写README突出作业实现,新增CLAUDE.md

README: 以"我的Python实现"为中心,对比原版与简化版
CLAUDE.md: 项目概述、算法要点、文件结构
This commit is contained in:
2026-05-06 20:23:21 +08:00
parent ad8e5041f2
commit 249779ae72
2 changed files with 128 additions and 94 deletions
+55
View File
@@ -0,0 +1,55 @@
# CLAUDE.md — cDNA微阵列图像处理作业
## 项目概述
河南理工大学计算机学院图像处理课程作业。用Python实现cDNA微阵列图像的网格划分与阈值分割。
## 项目结构
```
src/
├── cDNA_segmentation.py ← 原版:完整处理流程
└── cDNA_gridding_simple.py ← 简化版:仅划线,用于课堂讲解 ★
results/ ← 原版输出(6张图)
results_simple/ ← 简化版输出(1张图)
cDNA图像处理实例/数据/cDNA/ ← 输入图像 + MATLAB示例
参考资料/NewGridAndCV/ ← MATLAB参考实现
```
## 两个Python实现
### 简化版 (`cDNA_gridding_simple.py`) — 课堂主讲
- 算法:投影求和 → (max-min)×10%阈值 → 过零点配对 → 划线
- 约150行,带详细中文注释,适合课堂讲解
- 输出:`results_simple/gridding_simple.png`
- **与原版网格线位置完全一致(误差0像素)**
### 原版 (`cDNA_segmentation.py`) — 完整实现
- 网格划分:自相关+白顶帽+Otsu+质心(参照MATLAB `GriddingAndCV.m`
- 三种阈值分割:人工阈值、Otsu、迭代阈值
- TV去噪(Chambolle投影算法,参照 `tvdenoise.m`
## 算法要点
简化版核心逻辑(`find_gap_lines`函数):
- 减阈值后:正=斑点区域,负=空隙
- 过零点交替出现:+→-(离开斑点),-→+(进入下一个斑点)
- 配对"离开→进入",中点=空隙中央=划线位置
## 输入数据
- `cDNA.png`820×820 RGB23×23斑点阵列,Cy3/Cy5双色荧光
- 斑点间距约35px,每斑点约18px宽
## 运行环境
Python`D:\ProgramData\anaconda3\envs\my_env`
依赖:numpy, scipy, scikit-image, matplotlib, Pillow
## 仓库
Gitea: `ssh://git@192.168.5.8:2222/Serendipity/cDNA-image-processing.git`
+73 -94
View File
@@ -1,118 +1,97 @@
# cDNA 微阵列图像处理作业资料
# cDNA 微阵列图像处理作业
## 作业概述
本次作业涉及 **cDNA 微阵列(基因芯片)图像处理**,主要研究两个核心问题:
1. **网格划分(Gridding** - 定位微阵列图像中每个点的精确位置
2. **图像分割(Segmentation** - 区分前景(基因点)与背景
> **作者**: 刘航宇 | 河南理工大学计算机学院 | 2026
---
## 资料清单
## 作业内容
### 1. 参考论文
本作业来自《图像处理实例1:cDNA图像分析》,完成以下三个任务:
| 文件名 | 作者 | 内容简介 |
|--------|------|----------|
| `2019-3-高污染基因芯片图像的网格划分_芦碧波.pdf` | 芦碧波 | 提出针对高污染基因芯片的网格划分方法,利用图像增强、分块处理和自动阈值检测来提高鲁棒性 |
| `封面+低对比度cDNA图像分割的局部水平集方法_芦碧波.pdf` | 芦碧波、刘利群、张霄宏、林忠华 | 提出基于局部信息的水平集方法,解决低对比度cDNA图像分割问题,引入局部图像拟合能量 |
| `显微图像分割.pdf` | - | 显微图像分割相关资料(密码保护,需另存为可读版本) |
### 2. MATLAB 代码
#### `NewGridAndCV/` - 网格划分与C-V分割实现
| 文件名 | 功能说明 |
|--------|----------|
| `demo_GriddingAndCV.m` | **主程序** - 演示网格划分和Chan-Vese分割的完整流程 |
| `GriddingAndCV.m` | 网格划分核心算法,使用自相关估计点间距 |
| `cvseg.m` | Chan-Vese 水平集分割算法 |
| `chenvese.m` | C-V 模型的另一种实现 |
| `tvdenoise.m` | TVTotal Variation)去噪算法 |
| `choice.m` | 剔除面积过小的连通区域 |
| `choosemaxobj.m` | 保留最大连通区域 |
| `contour_bw.m` | 轮廓提取与二值化 |
| `fillingholes.m` | 填充孔洞 |
| `kappa.m` | 曲率计算 |
| `maskcircle2.m` | 圆形掩膜生成 |
| `redcolorcontour.m` | 红色轮廓显示 |
| `showphi.m` | 显示水平集函数 |
#### `cDNA图像处理实例/` - 基础示例
| 文件名 | 功能说明 |
|--------|----------|
| `图像处理实例.pptx` | 实例讲解PPT |
| `数据/cDNA/Demo_cdna.m` | 基础演示代码 |
| `数据/cDNA/*.tif` | 测试图像数据 |
### 3. 图像数据
| 文件名 | 说明 |
|--------|------|
| `GSM16390_CH1.tif` | 通道1原始图像(~26MB |
| `GSM16390_CH2.tif` | 通道2原始图像(~26MB |
| `GSM16390_CH2color.tif` | 彩色合成图像(~79MB |
| `*_small.tif` | 上述图像的缩小版本 |
| `cDNA.png` | 测试用cDNA图像 |
| `I_bw.jpg` | 二值化结果示例 |
| `I_griddingout.tif` | 网格划分输出示例 |
| 任务 | 内容 | 实现状态 |
|------|------|----------|
| 1 | 分析涉及的图像处理技术 | 见PPTX |
| 2 | 编写阈值分割代码(人工阈值 / 迭代阈值 / Otsu) | `src/cDNA_segmentation.py` |
| 3 | 选取cDNA图像进行分割 | 对cDNA.png完成网格划分+分割 |
---
## 核心算法简介
## 我的Python实现
### 网格划分算法流程
### 文件结构
```
1. 读取图像 → 转灰度
2. 计算行/列投影(均值
3. 自相关分析 → 估计点间距
4. 形态学滤波 → 去除背景
5. 阈值分割 → 标记峰值区域
6. 提取质心 → 确定网格点位置
src/
├── cDNA_segmentation.py # 原版:完整流程(网格划分 + 阈值分割 + 可视化
└── cDNA_gridding_simple.py # 简化版:仅划线,适合课堂讲解
results/ ← 原版输出
results_simple/ ← 简化版输出
```
### Chan-Vese 水平集分割
### 原版 (`cDNA_segmentation.py`)
- **核心思想**:不依赖图像梯度,基于区域统计信息分割
- **能量函数**$E = \mu \cdot Length(C) + \nu \cdot Area(C) + \lambda_1 \int_{inside(C)} |I - c_1|^2 + \lambda_2 \int_{outside(C)} |I - c_2|^2$
- **优势**:对模糊边缘和低对比度图像效果好
完整实现,参照MATLAB代码 `NewGridAndCV/`
### 局部水平集方法(论文贡献)
| 模块 | 方法 |
|------|------|
| 网格划分 | 投影 → 自相关估间距 → 白顶帽去背景 → Otsu → 质心提取 |
| 阈值分割 | 人工固定阈值、Otsu自动阈值、迭代阈值 |
| 去噪 | TV全变分去噪(Chambolle投影算法) |
| 后处理 | 去小连通域 + 保留最大连通域 |
- 引入局部图像拟合能量 $E^{LIF}$
- 使用高斯核 $K_\sigma$ 提取局部信息
- 能有效处理灰度不均匀的cDNA图像
### 简化版 (`cDNA_gridding_simple.py`) ★ 课堂主讲
---
算法3步即可理解,与原版误差为 **0像素**
## 运行环境
- **MATLAB** R2016b 或更高版本
- **需要工具箱**
- Image Processing Toolbox
- Signal Processing Toolbox(用于自相关计算)
---
## 快速开始
```matlab
% 1. 进入代码目录
cd NewGridAndCV
% 2. 运行演示
demo_GriddingAndCV
% 3. 或单独运行网格划分
GriddingAndCV
```
1. 灰度图 → 每列/行灰度值求和 → 投影曲线
2. 阈值 X = (max - min) × 10%,曲线减 X
3. 正=斑点,负=空隙 → 过零点配对 → 中点即划线位置
```
---
## 参考文献
## 运行
1. 芦碧波. 高污染基因芯片图像的网格划分[J]. 河南理工大学学报(自然科学版), 2019.
2. 芦碧波, 刘利群, 张霄宏, 林忠华. 低对比度cDNA图像分割的局部水平集方法[J]. 中国图象图形学报, 2014.
```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像素** |
简化版虽算法极简,但精度与原版完全一致,非常适合课堂讲解和教学演示。