diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..d437f4c --- /dev/null +++ b/CLAUDE.md @@ -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 RGB,23×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` diff --git a/README.md b/README.md index 574af15..9f01009 100644 --- a/README.md +++ b/README.md @@ -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` | TV(Total 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像素** | + +简化版虽算法极简,但精度与原版完全一致,非常适合课堂讲解和教学演示。