Skip to content
Back to skills

Anisotropic Spacing Trilinear Resample

ASecurity

Resample a 3D medical volume to a fixed network input shape using physical voxel spacing (dz, dy, dx), correcting the Z dimension by the dz/dy ratio so anisotropic CT scans (1mm in-plane, 5mm slice) end up anatomically isotropic before trilinear interpolation

  • 61 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 12, 2026
developmentpython

Security analysis

A100/100

Scanned September 12, 2026

npx -y skills add wenmin-wu/ds-skills --skill anisotropic-spacing-trilinear-resample --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Anisotropic Spacing Trilinear Resample?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Anisotropic Spacing Trilinear Resample
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/wenmin-wu-anisotropic-spacing-trilinear-resample/badge)](https://www.skillsdirectory.com/skills/wenmin-wu-anisotropic-spacing-trilinear-resample)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: cv-anisotropic-spacing-trilinear-resample
description: Resample a 3D medical volume to a fixed network input shape using physical voxel spacing (dz, dy, dx), correcting the Z dimension by the dz/dy ratio so anisotropic CT scans (1mm in-plane, 5mm slice) end up anatomically isotropic before trilinear interpolation
---

## Overview

CT volumes are routinely anisotropic: 0.7mm in-plane and 5mm between slices is normal. If you `F.interpolate` a `(60, 512, 512)` volume directly to `(96, 256, 256)`, you stretch the Z axis 1.6x in voxel space but the *physical* distance per slice is already 7x the in-plane spacing — the resulting volume looks correct in tensor shape but is geometrically wrong, and the network learns the wrong aspect ratio. The fix is to first scale the slice count by `dz / dy` (the spacing ratio), then resample to the target shape. This delivers an anatomically isotropic input regardless of the source acquisition.

## Quick Start

```python
import torch
import torch.nn.functional as F

def resample_to_shape(image, spacing, target_hw=256, target_d=96):
    dz, dy, dx = spacing             # physical mm/voxel
    d, h, w = image.shape

    # 1. Correct Z count by physical-spacing ratio (anisotropy fix)
    d_iso = int(dz / dy * d * 0.5)   # 0.5 = empirically tuned compression

    # 2. Scale all axes to in-plane target
    scale = target_hw / h
    d_out = int(scale * d_iso)
    h_out = w_out = int(scale * h)

    # 3. Final resample to fixed network input shape
    image = F.interpolate(image[None, None],
                          size=(d_out, h_out, w_out),
                          mode='trilinear',
                          align_corners=False)[0, 0]
    image = F.interpolate(image[None, None],
                          size=(target_d, target_hw, target_hw),
                          mode='trilinear',
                          align_corners=False)[0, 0]
    return image
```

## Workflow

1. Read `PixelSpacing` (dy, dx) and `SliceThickness` (or `SpacingBetweenSlices`) → `dz` from the DICOM headers
2. Compute the anisotropy-corrected slice count `d_iso = int(dz / dy * d * factor)`
3. First interpolate to an isotropic intermediate, then to the fixed network input shape
4. Use trilinear (not nearest, not linear-per-axis) for both passes
5. Cache the per-series spacing alongside the cropped volume to avoid re-reading DICOM headers at training time

## Key Decisions

- **Physical spacing first, voxel resize second**: skipping the spacing correction trains the model on geometrically distorted anatomy.
- **`* 0.5` factor**: pure `dz/dy` over-corrects in practice — a damping factor between 0.4 and 0.6 is empirically best for abdominal CT.
- **Two-pass interpolation**: collapsing the two `interpolate` calls into one introduces aliasing for high anisotropy ratios.
- **`align_corners=False`**: the PyTorch default for new code; matches OpenCV/numpy convention.
- **Handles missing `dz`**: fall back to `SpacingBetweenSlices` if `SliceThickness` is absent; some scanners populate only one.

## References

- [LB 0.55 — 2.5D + 3D sample model](https://www.kaggle.com/competitions/rsna-2023-abdominal-trauma-detection)

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.