mcpField
M
matlab-read-medical-data

matlab-read-medical-data

github.com/matlab数据与数据库1.2k45 次安装1 天前更新
代码仓库

关于 matlab-read-medical-data

为 MATLAB 医学影像处理提供读取、写入和操作 DICOM、NIfTI、NRRD 数据的指导。它会先检查可用工具箱,并优先采用 Medical Imaging Toolbox 的接口。

主要功能

  1. 01读取与写入医学影像文件
  2. 02列出并选择 DICOM 序列
  3. 03提取空间参考与坐标变换
  4. 04调整体数据方向并提取切片
  5. 05处理 DICOM RT 结构与匿名化

适用场景

  1. 01读取 DICOM 文件夹或 NIfTI 体数据
  2. 02从多序列目录中选择目标序列
  3. 03提取指定方向的医学影像切片
  4. 04匿名化 DICOM 或编辑 RT 结构

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/matlab/matlab-agentic-toolkit --skill matlab-read-medical-data

安装后在 Claude Code 中输入/matlab-read-medical-data确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

manifest.yaml
references/
dicom-anonymization.md
dicom-rt-workflows.md
ipt-reading-writing.md
mit-medical-volume.md
mit-spatial-referencing.md

详细介绍

读取和写入医学数据

在 MATLAB 中读取、写入和处理医学成像数据。本技能涵盖 Image Processing Toolbox(IPT)函数和 Medical Imaging Toolbox(MIT)增强型 API。

适用场景

  • 读取或写入 DICOM、NIfTI 或 NRRD 文件
  • 使用 dicomCollection 列出 DICOM 序列
  • 提取空间参考信息或坐标变换
  • 更改体数据方向或提取定向切片
  • 处理 DICOM RT 结构(轮廓、掩膜、修改/写入)
  • 匿名化 DICOM 数据

不适用场景

  • 显示或可视化体数据(使用 matlab-display-volume 技能)
  • 显示带注释的 2-D 医学图像(使用 matlab-display-image 技能)
  • 读取非医学图像格式(PNG、TIFF、JPEG)——使用 imread

工具箱检测——首要关键步骤

选择处理方式前,务必检查哪些工具箱可用。 如果已安装 Medical Imaging Toolbox,优先使用其 API。如果只有 Image Processing Toolbox 可用,则使用 IPT 模式。

任务 → 函数速查表

任务仅使用 IPT使用 Medical Imaging Toolbox(首选)
读取单个 DICOM 文件dicomread + dicominfomedicalImage
读取 DICOM 文件夹dicomreadVolumemedicalVolume
读取 NIfTIniftiread + niftiinfomedicalVolume
读取 NRRD—(需要 MIT)medicalVolume 或 nrrdread + nrrdinfo
列出 DICOM 序列dicomCollectiondicomCollection
空间参考imref3dmedicalref3d
提取定向切片手动索引extractSlice
更改方向手动使用 permuteupdateOrientation
读取 DICOM RT 结构dicomContours(dicominfo(file))同左
匿名化 DICOMdicomanon + dicomuid同左
可视化体数据volumeViewermedicalVolumeViewer 或 volshow(medVol)

4 个常用模式

1. 读取 DICOM 文件夹

直接对 DICOM 文件夹路径调用 medicalVolume 或 dicomreadVolume。不要先调用 dicomCollection——读取仅包含单个序列的文件夹时,这没有必要。

% WITH Medical Imaging Toolbox (preferred):
medVol = medicalVolume("path/to/dicom/folder");
V = medVol.Voxels;               % Auto-rescaled (e.g., HU for CT)
spacing = medVol.VoxelSpacing;   % [dx dy dz] in mm
orientation = medVol.Orientation; % "transverse", "coronal", "sagittal"
modality = medVol.Modality;       % "CT", "MR"

% Access spatial referencing via VolumeGeometry (medicalref3d object)
geom = medVol.VolumeGeometry;
geom.VolumeSize;                  % [rows cols slices]
geom.PatientCoordinateSystem;     % "LPS+" or "RAS+"
geom.Position;                    % [slices×3] slice positions in patient coords
geom.VoxelDistances;              % {[slices×3] [slices×3] [slices×3]} per-axis distances
geom.PixelSpacing;                % [slices×2] in-plane pixel spacing per slice
geom.IsAffine;                    % true if uniform spacing (affine transform)
geom.IsAxesAligned;               % true if volume axes align with patient axes
geom.IsMixed;                     % true if slices have varying pixel spacing

% IPT only:
[V, spatial, dim] = dicomreadVolume("path/to/dicom/folder");
V = squeeze(V);  % Remove singleton 4th dimension
2. 读取 NIfTI 文件
% WITH Medical Imaging Toolbox (preferred):
medVol = medicalVolume("path/to/file.nii.gz");

% IPT only:
V = niftiread("path/to/file.nii.gz");
info = niftiinfo("path/to/file.nii.gz");
voxelSize = info.PixelDimensions(1:3);
3. 列出 DICOM 序列并读取其中一个

仅在以下情况下使用 dicomCollection:

  • 用户说明文件夹中包含多个序列或体数据
  • medicalVolume 或 dicomreadVolume 失败并报错(例如“不是 DICOM 文件”或“检测到多个体数据”)
  • 在决定读取哪个序列之前,需要确认有哪些序列

dicomCollection 会扫描目录、排除非 DICOM 文件,并返回一个表格,每一行对应一个序列。它不会读取像素数据。

collection = dicomCollection("path/to/directory");
disp(collection);  % Table with Modality, SeriesDescription, Rows, Columns, Frames

% WITH Medical Imaging Toolbox:
medVol = medicalVolume(collection, "s1");

% IPT only:
[V, spatial] = dicomreadVolume(collection, "s1");
4. 提取切片 / 更改方向(需要 Medical Imaging Toolbox)
medVol = medicalVolume("path/to/file.nii");

% Extract slices — works for any orientation
[axialSlice, position, spacings] = extractSlice(medVol, 50, "transverse");
[coronalSlice, ~, ~] = extractSlice(medVol, 30, "coronal");
[sagittalSlice, ~, ~] = extractSlice(medVol, 45, "sagittal");

% If medVol.Orientation is not empty, use it as the third input
[sliceData, position, spacings] = extractSlice(medVol, 50, medVol.Orientation);

% Change orientation — do NOT use permute
medVolCoronal = updateOrientation(medVol, "coronal");  % Returns NEW object

updateOrientation 于 R2025a 引入。

详细参考文件

重要:为以下任何任务生成代码前,请先阅读匹配的参考文件。

任务触发条件参考文件编写前请先阅读
使用 IPT 读取/写入 DICOM 或 NIfTIreferences/ipt-reading-writing.md编写 dicomreadVolume、niftiread、imref3d 或重缩放逻辑
使用 medicalVolume、medicalImage、切片或方向references/mit-medical-volume.md编写 medicalImage、medicalVolume、extractSlice 或 updateOrientation 调用
空间参考或坐标变换references/mit-spatial-referencing.md编写 medicalref3d、intrinsicToWorld 或 worldToIntrinsic 调用
RT 结构(轮廓、标签图、RTSTRUCT)references/dicom-rt-workflows.md读取、编辑、显示或绘制轮廓/RTSTRUCT 文件,或编写任何 dicomContours、plotContour、createMask、addContour、deleteContour 调用
匿名化 DICOM 文件references/dicom-anonymization.md编写任何 dicomanon 或 dicomuid 调用

应避免的旧模式

不要使用改用原因
对单个文件使用 dicomread + dicominfomedicalImage(MIT)统一访问、自动重缩放
对 DICOM 文件夹使用 dicomreadVolumemedicalVolume(MIT)保留空间参照
niftiread + niftiinfomedicalVolume(MIT)统一容器
使用 V.Voxels(:,:,n) 或 V(:,:,n) 提取切片extractSlice(medVol, n, medVol.Orientation)(MIT)处理方向和空间元数据,无论存储顺序如何都能正常工作
手动使用 permute 调整方向updateOrientation(medVol, orient)(MIT)更新空间元数据
手动解析 RT 结构体dicomContours(info)输出整洁的表格
volumeViewermedicalVolumeViewer(MIT,R2026a)医学专用功能
对医学图像使用 imshowimageshow为医学数据提供更合适的默认设置

约定

  • 选择函数前,始终检测可用的工具箱
  • 优先使用 Medical Imaging Toolbox API(medicalVolume、medicalImage)
  • 对不可变方法始终捕获其输出(deleteContour、updateOrientation)
  • 写入 RT Structure DICOM 文件时,始终使用 CreateMode="Copy"
  • 默认不要在 medicalVolume/dicomreadVolume 前调用 dicomCollection——直接对文件夹路径调用读取函数
  • 仅在以下情况下使用 dicomCollection:文件夹中包含多个序列、medicalVolume 出错,或需要在不读取像素数据的情况下确定有哪些序列
  • 对灰度数据,始终对 dicomreadVolume 的输出使用 squeeze
  • 始终使用 extractSlice 从 medicalVolume 获取切片——不要使用 V.Voxels(:,:,n) 手动索引。extractSlice 会处理方向和空间元数据,无论卷在磁盘上的存储方式如何都能正确工作
  • 切勿手动解析嵌套的 DICOM 结构体——使用 dicomContours
  • extractSlice 参数顺序:(vol, sliceIndex, direction)——数值参数在字符串参数之前
  • intrinsicToWorld 返回 3 个独立输出:[x, y, z]——而非单个向量

版权所有 2026 The MathWorks, Inc.


评论

支持 Markdown