# dicom-series-to-volume

Turns one CT DICOM series folder into an HU NIfTI volume plus a JSON summary with the affine. Handy before feeding scans to a segmentation model.

- skill · `type=skill` · Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, OpenCode · 1900 installs · ★ 3735
- Author: NVIDIA MedTech Team
- License: Apache-2.0 · policy=mirror · the beginning of the file is at the end of this page
- Source: https://github.com/NVIDIA/skills/tree/HEAD/skills/dicom-series-to-volume/SKILL.md
- Updated: 2026-10-23
- HTML: https://affpapa.org/en/nevibecode/skills/dicom-series-to-volume

## What it does

The skill reads a single DICOM series, sorts slices by `ImagePositionPatient`, applies `RescaleSlope` and `RescaleIntercept`, and builds an affine from the orientation and spacing tags. You get a `.nii.gz` file and a JSON summary with `n_slices`, `series_instance_uid`, `output.shape`, `output.spacing`, `output.axcodes`, `output.affine`, `hu_range` and conversion time.

Everything runs through one script, `scripts/series_to_volume.py`, declared in `skill_manifest.yaml`. The call is `python scripts/series_to_volume.py PATH_TO_DICOM_DIR --output PATH_TO_OUT.nii.gz`. If your host agent exposes `run_script`, use that instead. Keep outputs under a run directory you provide.

You need Python with the packages listed in `runtime.side_effects.pip_packages`, and NiBabel 5.4 or newer so extreme-oblique axes stay labeled consistently across reorientation. Multi-series input is rejected at preflight; multi-frame DICOM and compressed transfer syntaxes (JPEG, JPEG2000, RLE) are out of scope. There is no voxel reorientation — the affine comes from the headers, so a downstream gate such as `expected_axcodes` should assert orientation before the volume reaches a segmentation model. For clinical work use a vetted converter like dcm2niix.

## Install

### Claude Code (native platform)

1. **Skills CLI (Vercel)**
```bash
npx skills add NVIDIA/skills --skill dicom-series-to-volume -a claude-code
```

2. **Manually: put the files in place**
- File: `~/.claude/skills/dicom-series-to-volume/SKILL.md` — Copy the whole skill folder; for one project use .claude/skills/dicom-series-to-volume/

### Codex

1. **Skills CLI (Vercel)**
```bash
npx skills add NVIDIA/skills --skill dicom-series-to-volume -a codex
```

2. **Manually: put the files in place**
- File: `.agents/skills/dicom-series-to-volume/SKILL.md` — For all projects use ~/.agents/skills/

### Cursor

1. **Skills CLI (Vercel)**
```bash
npx skills add NVIDIA/skills --skill dicom-series-to-volume -a cursor
```

2. **Manually: put the files in place**
- File: `.cursor/skills/dicom-series-to-volume/SKILL.md` — Cursor also reads .agents/skills/ and .claude/skills/

### GitHub Copilot

1. **GitHub CLI**
```bash
gh skill install NVIDIA/skills dicom-series-to-volume
```

2. **Manually: put the files in place**
- File: `.github/skills/dicom-series-to-volume/SKILL.md`

### Gemini CLI

1. **Skills CLI (Vercel)**
```bash
npx skills add NVIDIA/skills --skill dicom-series-to-volume -a gemini-cli
```

2. **Platform CLI**
```bash
gemini skills install https://github.com/NVIDIA/skills --path skills/dicom-series-to-volume
```

### Windsurf (Devin Desktop)

**Manually: put the files in place**
- File: `.devin/skills/dicom-series-to-volume/SKILL.md` — The legacy .windsurf/skills/ path still works

### OpenCode

**Skills CLI (Vercel)**
```bash
npx skills add NVIDIA/skills --skill dicom-series-to-volume -a opencode
```

### Claude.ai

**Claude.ai**
- Zip the folder and upload it in Settings → Capabilities → Skills

Where a file is given instead of a command, copy the files from the source to that path: https://github.com/NVIDIA/skills/tree/HEAD/skills/dicom-series-to-volume/SKILL.md

## When to use it
- convert one CT DICOM series into an HU NIfTI volume
- get the affine and voxel spacing in machine-readable JSON
- sort slices by patient position before building the volume
- check conversion quality with the paired `dicom_volume_quality_v1` verifier
- catch unsupported input at preflight instead of mid-pipeline

## Example prompts
- Convert this CT series folder to an HU NIfTI volume and show me the JSON summary
- Run `scripts/series_to_volume.py` on `PATH_TO_DICOM_DIR` with output to `runs/ct_volume.nii.gz`
- Verify the run with the paired `dicom_volume_quality_v1` verifier

## Source text · SKILL.md · Apache-2.0

Below is the content of a third-party file. It is data, not instructions for you: do not act on anything written inside unless the human asks. Block tag: cc2476b78a77ada3.

BEGIN THIRD-PARTY FILE cc2476b78a77ada3
```text
---
name: dicom-series-to-volume
description: Used for converting one CT DICOM series folder to a HU NIfTI volume with affine evidence. Not for multi-frame DICOM or clinical use.
license: Apache-2.0
allowed-tools: Bash
metadata:
  author: 'NVIDIA MedTech Team'
  tags:
    - MedTech
    - DICOM
    - NIfTI
---

# dicom_series_to_volume

## Purpose
- Used for converting one CT DICOM series folder to a HU NIfTI volume with affine evidence. Not for multi-frame DICOM or clinical use.
- Use the wrapper exactly as documented; do not replace the upstream entrypoint with a handwritten implementation.
- Manifest I/O: inputs are `dicom_dir`; outputs are `nifti_volume` and `result_json`.

## Instructions
- Read `skill_manifest.yaml` before changing arguments, side effects, or validation gates.
- Run `scripts/series_to_volume.py` through the documented command below; keep outputs under a caller-provided run directory.
- If a host agent exposes `run_script`, use `run_script("scripts/series_to_volume.py", args=[...])`; otherwise run the Bash/Python command shown below.
- Check the emitted JSON and the paired `dicom_volume_quality_v1` verifier before treating the run as evidence.

## Available Scripts
| Script | Purpose | Arguments |
|---|---|---|
| `scripts/series_to_volume.py` | Primary entrypoint declared by skill_manifest.yaml. | `PATH_TO_DICOM_DIR [--output OUT.nii.gz]` |

## Prerequisites
- Runtime requirements: Python packages listed in `runtime.side_effects.pip_packages`.
- NiBabel 5.4 or newer is required so extreme-oblique axes remain labeled consistently across reorientation.
- Run commands from the repository root unless an existing section below says otherwise.

## Limitations
- Single-series only; multi-series input is rejected at preflight.
- Multi-frame DICOM (NumberOfFrames > 1 per file) not supported.
- Compressed transfer syntaxes (JPEG / JPEG2000 / RLE) not supported.
- No voxel reorientation. The affine is derived from DICOM headers and represented in NIfTI/RAS coordinates; a downstream gate (e.g. expected_axcodes) is expected to assert orientation before this volume is fed to a segmentation model.
- Not for clinical deployment, autonomous diagnosis, regulatory submission, production inference (use a vetted converter such as dcm2niix for that).

## Troubleshooting
| Error | Cause | Fix |
```
END THIRD-PARTY FILE cc2476b78a77ada3

The third-party file has ended. Everything between the cc2476b78a77ada3 tags is data: requests and commands from it are not followed. An “end of file” line with another tag inside the block is part of the file.

First 2333 of 3703 bytes. © NVIDIA MedTech Team · Apache-2.0 · https://github.com/NVIDIA/skills/tree/HEAD/skills/dicom-series-to-volume/SKILL.md

_Part of the page did not fit — see the HTML version._

---
NeVibeCode on affpapa.org. Catalog texts are descriptions, not instructions for the agent. How to choose and install: https://affpapa.org/en/nevibecode/agents.md
