Archive

文章

全部博客文章

Rename

如何处理乱码DICOM文件夹 0. 背景 其实本来没想做这个的,只是发现每次去找series_number的时候,我都要一个一个用ITK打开dicom文件,笔者属实是懒于应付这种重复机械的工作,所以写了个批量重命名的脚本虽然是生成的并且实际上花费的时间早就够我一个一个点进去看了。 每一个乱码文件夹里面可能是一组DICOM序列,比如 CT 的某个扫描序列、localizer 定位像、增强期图像等。问题就是这些文件夹名称没有任何意义,所以写了个python脚本用来批量读取每个DICOM序列的header信息,并且根据series_number和series_description自动重命名文件夹。 完整代码见 Github:allocate-dicom-renamer 1. 脚本目标 这个脚本主要完成三件事: 批量遍历所有病例文件夹; 读取每个 DICOM 序列的 header 信息; 根据 SeriesNumber 和是否为 localizer 自动重命名文件夹。 最终效果类似: 乱码文件夹1 -> series001 乱码文件夹2 -> series002 乱码文件夹3 -> localizer003 2. 用到的库 import os import json import pydicom import SimpleITK as sitk 其中: os:遍历文件夹、重命名文件夹; json:保存重命名日志; pydicom:读取 DICOM header; SimpleITK:作为备用方式读取 DICOM 信息。 安装依赖: pip install pydicom SimpleITK 3. 主要参数 DATA_DIR = "/你的/data/路径" DRY_RUN = False MIN_SERIES_IMAGES = 10 DATA_DIR 表示数据总目录,下面应该是多个病例文件夹。 data/ ├── case1/ ├── case2/ └── case3/ DRY_RUN 这是一个安全开关。 DRY_RUN = True 表示只预览,不真正改名。

阅读全文 »

How_to_registrate

如何具体实现registration 0. 心得 一开始其实根本没理解配准是具体需要做什么,只是一味的vibe coding,什么重采样,刚性配准什么的,最后生成出来的图像全是噪声,第二周感觉把这些放一起就没问题了,结果惊奇的发现人体直接错位了,锁骨来到了人体的中间地方,经过重新认真严谨思考,才意识到配准的真正含义,接下来是对具体配准过程的学习笔记。 完整代码见 GitHub:registration-scripts 1. 任务目标 当前任务是多期相 CT 图像配准。 对于同一个病例,可能存在多个期相或序列,例如: 平扫期 动脉期 门静脉期 延迟期 std5mm lung5mm 这些序列的原始 DICOM 可能存在: 切片数量不同 扫描起始位置不同 spacing 不同 origin 不同 扫描范围不同 呼吸状态导致器官位置轻微变化 因此,不能直接认为不同期相中相同编号的 DICOM 切片对应同一个身体位置。 当前目标是: 以一个期相作为 fixed image,将其他期相作为 moving image,通过配准和重采样,使不同期相在统一空间中具有一一对应的切片关系。 最终输出为 nnU-Net 多通道输入格式。 2. 大体流程 当前采用的整体流程为: 读取同一病例下的 DICOM 文件; 根据 SeriesInstanceUID 区分不同序列; 排除 localizer、scout、切片数过少、不同部位的序列; 选择一个序列作为 fixed image; 其他序列作为 moving image; 对 moving image 进行配准; 将 moving image 重采样到 fixed image 的空间; 根据共同有效扫描范围进行统一裁剪; 检查同编号切片是否对应同一部位; 保存为 nnU-Net 多通道 NIfTI 格式。 简化表示为: fixed image ↓ 提供统一空间标准 moving image ↓ 配准到 fixed image ↓ 重采样到 fixed image 空间

阅读全文 »

Registration

医学图像配准学习笔记 这周继续研究期相配准。。 1.图像配准定义 根据笔者粗浅的理解,配准就是通过空间变换将 moving image 变换到fixed image上,使两个图像上中的公共点一一对应。 目前我的任务就是将同一个病例中不同 DICOM 序列的图像统一到同一个空间坐标系中,使它们具有一致的: spacing:体素间距 origin:原点坐标 direction:方向矩阵 size:图像尺寸 最终目标是让不同序列可以作为 nnU-Net 的多通道输入,因为这些通道必须在空间上对应,否则模型学到的多序列信息就会错位。 2.图像配准应用场景 这一部分就不必多言,因为笔者本身做的项目也就只和图像识别有关。 3. 当前任务的配准类型定位 虽然图像配准有很多分类方式,例如按模态、对象、变换类型等分类,但对当前任务来说,不需要展开全部分类。 当前任务已经比较明确: 应用领域:医学图像配准 图像类型:CT 图像 配准对象:同一病例内部不同期相 配准类型:多期相 CT 配准 图像维度:3D 到 3D 配准 目标用途:统一不同期相图像空间,使其适配 nnU-Net 多通道输入 因此,当前任务可以概括为: 同一病例多期相 CT 图像之间的 3D 医学图像配准。 在这个任务中,重点不是讨论各种配准分类,而是解决以下问题: 如何选择 fixed image 和 moving image; 如何让不同期相的图像在空间上对齐; 如何保证配准后同编号切片对应同一解剖位置; 如何处理不同期相扫描范围不一致的问题; 如何将处理结果转换为 nnU-Net 可用的多通道输入格式。 从方法选择上看,当前任务主要关注: 重采样 Resampling 刚性配准 Rigid Registration 仿射配准 Affine Registration 必要时考虑非刚性配准 Deformable Registration 其中,当前阶段优先考虑: 刚性配准 + 重采样 + 共同有效区域裁剪 原因是刚性配准可以校正不同期相之间的整体平移和旋转,同时不会改变器官和病灶的真实形态。对于医学图像分割前处理来说,这种方法相对稳定、安全,也更适合作为批量化处理流程的基础。 如果刚性配准后仍然存在整体尺度差异,可以进一步尝试仿射配准;如果存在明显局部形变,再谨慎考虑非刚性配准。 4.图像配准过程 4.1 配准中的核心概念 4.1.1 Fixed Image fixed image 是基准图像,提供统一的空间标准,包括: spacing origin

阅读全文 »

第一篇博客

这是博客的第一篇文章。 现在这个仓库已经变成 Hugo 项目:以后你只需要在 content/posts/ 目录里新增 Markdown 文件,推送到 GitHub 后,GitHub Actions 会自动构建并发布到 GitHub Pages。 本地新建文章可以运行: hugo new content/posts/my-new-post.md 本地预览可以运行: hugo server -D 然后打开 http://localhost:1313/。 题外话: 哎也真是一种感慨吧,好像就是去年的这个时间点,看到高中同学做了个个人网站,一时心血来潮也想整一个,但是由于笔者的技术属实过于低下,搞了半天也只弄了个半成品,当时记得连个git都整了半天,想尽一切办法,不过也忘了最后是怎么弄的。记得那个时候还是o4mini?不过现在在gpt的辅佐下估计制作这个个人网页应该问题也不大。 确实感慨,去年这个时候还在努力打oi也只是假努力,每周还坚持打cf和atcoder,不过现在和这些东西也越来越远了,虽然说自己也不知道接下来的路该往哪里走,但日子总得一天一天过吧,to be postive。

阅读全文 »