micheledpierri.com

  • HOME
    • Python
    • Statistics
    • Data Analysis
    • Machine Learning
  • WRITINGS
  • VISIONS
  • ABOUT
Home / Blog / Orientation in Dicom
A lone early-20th-century traveler stands on a rocky ridge, holding a compass toward the light while surveying a vast golden mountain valley crossed by winding paths, in a warm, antique painterly style.

Orientation in Dicom

Posted on October 12, 2025August 11, 2026 by Michele Danilo Pierri

Understanding DICOM Coordinate Systems and Image Orientation: Why Your 3D Volume Looks Upside Down


1. Introduction — Why Orientation Matters

Have you ever opened a medical image and found the anatomy upside down or mirrored?

It’s not your viewer’s fault — it’s about geometry.

DICOM files contain not only pixels, but also the mathematical information that tells a viewer where those pixels belong in the patient’s body.

This information — stored in a few special orientation tags — determines whether your 3D reconstruction looks anatomically correct or completely inverted.

In this article, we’ll explore:

  • how DICOM defines spatial orientation,
  • what its key tags actually mean,
  • and how to verify them in Python.

By the end, you’ll understand why one missing minus sign can literally turn a patient upside down.


2. From Pixels to Space — How Medical Images Have Coordinates

When you view a CT slice, you’re looking at a 2D grid of numbers.

But in medicine, every pixel must correspond to a real point in space, measured in millimeters.

To achieve this, DICOM defines a patient-based coordinate system, called LPS:

L (Left) → x-axis positive toward the patient’s left

P (Posterior) → y-axis positive toward the back

S (Superior) → z-axis positive toward the head

So, instead of just rows and columns, every DICOM slice is a plane positioned in 3D, with its own origin, orientation, and scale.

Some research formats, such as NIfTI, use a different convention called RAS (Right–Anterior–Superior), where the X and Y axes are mirrored relative to DICOM’s LPS system.
For clinical DICOM images, however, all coordinates and orientation vectors are defined in the LPS frame, the only one used by PACS viewers and DICOM software.


3. DICOM Tags: How Geometry Is Stored

Every piece of information in a DICOM file is stored as a data element, identified by a tag.

Each data element has four key components:

FieldMeaningExample
Tag4-byte identifier (Group,Element) in hex(0020,0037)
VR (Value Representation)Data type (e.g., DS = Decimal String)DS
VM (Value Multiplicity)How many values (1, 2, 3, 6, …)6
ValueActual data stored as text or binary"1\\0\\0\\0\\-1\\0"

Together, these fields describe everything from patient name to scanner position — but for orientation, three particular tags define where and how each image plane exists in space.


4. The Geometry Trio: IPP, IOP, and PS

These three tags are the geometric foundation of every DICOM image:

TagNameVRVMPurposeExample
(0020,0032)ImagePositionPatient (IPP)DS33D coordinates (x, y, z) of the top-left pixel center (mm). Defines where the plane is."-121.7\\-23.7\\766.7"
(0020,0037)ImageOrientationPatient (IOP)DS6Two unit vectors describing row and column directions in patient coordinates. Defines how the plane is oriented."1\\0\\0\\0\\-1\\0"
(0028,0030)PixelSpacing (PS)DS2Physical distance (mm) between pixel centers along rows and columns. Defines scale."0.625\\0.625"

All coordinates are expressed in millimeters in the LPS frame.


5. How These Tags Define an Image Plane

Each DICOM image is not just a 2D grid of pixels — it’s a plane positioned in the 3D coordinate system of the patient.

To understand where each pixel lies in space, DICOM combines three pieces of information:

  1. ImagePositionPatient (IPP) → the 3D coordinates of the origin (the center of the top-left pixel).
  2. ImageOrientationPatient (IOP) → two unit vectors defining the row and column directions of the image plane.
  3. PixelSpacing (PS) → the physical distance between adjacent pixels, measured in millimeters.

Together, they define a simple but powerful equation that maps pixel indices (i, j) to their physical location (x, y, z) in the patient’s coordinate system (LPS).

Graphic illustration of Dicom spatial concepts

The DICOM Spatial Mapping Formula

According to the DICOM standard (Part 3, Section C.7.6.2.1-1):

P(i,j) = IPP + j · PS[1] · row + i · PS[0] · col

where:

SymbolMeaning
P(i, j)3D coordinates (x, y, z) of pixel (i, j) in the patient’s space
IPPImagePositionPatient — origin of the image plane (mm)
PS[0]PixelSpacing for rows (row spacing). It scales the column direction (col).
PS[1]PixelSpacing for columns (column spacing). It scales the row direction (row).
rowfirst three values of ImageOrientationPatient (direction cosines of image rows)
collast three values of ImageOrientationPatient (direction cosines of image columns)
i, jrow and column indices, starting from (0,0) in the top-left corner

Intuitive interpretation

  • Moving by +1 column (increasing j) shifts you along the row direction (row × PS[1] mm).
  • Moving by +1 row (increasing i) shifts you along the column direction (col × PS[0] mm).
  • The origin (0,0) is at the top-left pixel center, whose absolute coordinates are given by IPP.

The plane normal — the direction in which slices are stacked to form a 3D volume — is defined by the cross product:

normal = row × col

Practical insight

This simple affine relationship is what allows 3D reconstruction software (like 3D Slicer, OsiriX, or Weasis) to rebuild a consistent volume.

However, if the normal vector points in the wrong direction (for example, due to swapped axes or inconsistent slice order), the resulting volume will appear flipped — even though all the pixel data are numerically correct.


6. Example: Reading and Interpreting Real Tag Values

Let’s look at a real-world example taken from an actual DICOM header:

(0020,0032) ImagePositionPatient = -121.7\\-23.7\\766.7
(0020,0037) ImageOrientationPatient = 1\\0\\0\\0\\-1\\0
(0028,0030) PixelSpacing = 0.625\\0.625

From these values we can reconstruct the geometry of a single slice.

Step 1 – Extract the vectors

  • Row direction (first 3 values of IOP): row = [1, 0, 0] → points toward the patient’s left (L).
  • Column direction (last 3 values of IOP): col = [0, -1, 0] → points toward the patient’s posterior (P).
  • Normal vector (cross product): normal = row × col = [0, 0, -1] → points toward the inferior (feet).

This means the slices are physically stacked from superior to inferior (downward) along the patient’s body axis.

Step 2 – Understand the Pixel Spacing

PixelSpacing = [0.625, 0.625]

​These values represent the physical distance (in millimeters) between:

adjacent rows → along the column direction (PS[0]), and

adjacent columns → along the row direction (PS[1]).

So, moving one column to the right shifts the pixel 0.625 mm along row, and moving one row down shifts it 0.625 mm along col.

Step 3 – Compute any pixel’s real-world position

For pixel coordinates (i, j) (where i = row index, j = column index):

P(i,j) = IPP + j · PS[1] · row + i · PS[0] · col

Using the tag values:

P(i,j) = [-121.7, -23.7, 766.7] + j · 0.625 · [1, 0, 0] + i · 0.625 · [0, -1, 0]

This equation allows you to locate any pixel in absolute patient coordinates (LPS).

Step 4 – Analyze the slice orientation

Because the normal vector = [0, 0, -1], the Z-axis decreases as slice numbers increase — meaning that, in 3D, the next slice has a smaller Z value.

If your viewer assumes slices increase along +Z (superior direction), the reconstructed volume will appear upside down.

That’s why understanding the relationship between IOP, IPP, and slice order is essential for correct 3D visualization.

Summary

ConceptDefined byDirectionTypical interpretation
OriginImagePositionPatient(0,0) pixel center3D anchor point of slice
Row directionIOP[0:3]+X (Left)Horizontal axis on image
Column directionIOP[3:6]±Y (Posterior or Anterior, depending on IOP)Vertical axis on image
SpacingPixelSpacingPS[0] rows → along col • PS[1] cols → along rowPhysical scale
Normalrow × col+Z or –Z (depends on orientation)Slice stacking direction

In short, each DICOM slice is a mathematically defined plane in the patient’s body.

By combining ImagePositionPatient, ImageOrientationPatient, and PixelSpacing, you can reconstruct where every pixel lies in millimeter-accurate space — and explain exactly why a 3D volume looks “flipped” when these relationships are misunderstood.


7. Python Example — Read, Analyze, and Validate Orientation

The following script extracts and interprets the geometry of your DICOM files:

import numpy as np, pydicom
from glob import glob

def parse_floats(v):
    s = str(v).replace(',', '\\\\')
    return np.array([float(x) for x in s.split('\\\\') if x], dtype=float)

def read_geometry(ds):
    ipp = parse_floats(ds.ImagePositionPatient)
    iop = parse_floats(ds.ImageOrientationPatient)
    ps  = parse_floats(ds.PixelSpacing)
    row, col = iop[:3], iop[3:]
    row, col = row/np.linalg.norm(row), col/np.linalg.norm(col)
    normal = np.cross(row, col)
    return ipp, row, col, normal, ps

files = sorted(glob("DICOM_STACK/*.dcm"))
d1, d2 = map(pydicom.dcmread, files[:2])

ipp, row, col, normal, ps = read_geometry(d1)
print("IPP:", ipp)
print("Row:", row)
print("Column:", col)
print("Normal:", normal)
print("Pixel Spacing:", ps)

dz = [np.dot](<http://np.dot>)((read_geometry(d2)[0] - ipp), normal)
print("Δ along normal between slice #1 and #2 (mm):", dz)
if dz < 0:
    print("Warning: slices are stacked in the opposite direction.")

This lets you verify:

  • whether row/column vectors are orthogonal;
  • whether slices increase along the expected direction;
  • whether the viewer’s 3D reconstruction should appear upright.

8. Common Pitfalls and How to Avoid Them

❌ Assuming file order = anatomical order→ Always check the Z difference between consecutive ImagePositionPatient values.

❌ Mixing coordinate conventions→ DICOM uses LPS; some research tools use RAS (mirrored X/Y).

❌ Ignoring direction cosines→ The slice order alone doesn’t guarantee correct 3D orientation.

❌ Forgetting to normalize vectors→ Precision errors in floating-point values can distort 3D reconstructions.


9. References and further reading

  • DICOM Standard, Part 3, Section C.7.6.2 — Image Plane Module.[1]
  • SimpleITK documentation — orientation and DICOM conversion.[2]
  • MONAI documentation — spatial orientation and metadata.[3]
  • pydicom documentation — reading and writing headers and orientation tags.[4]

10. Conclusion

The DICOM format encodes geometry with precision — but that precision only helps if you understand it.

By reading and checking ImagePositionPatient, ImageOrientationPatient, and PixelSpacing, you can diagnose most orientation issues before they ruin your 3D visualization.

In medical imaging, orientation is anatomy — and a single misplaced sign can literally turn the patient upside down.

Cite this article

Pierri, M. D. (2025). Orientation in Dicom. micheledpierri.com. Permalink

Share:Email·LinkedIn

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

© 2024–2026 micheledpierri.com · Privacy Policy · Impressum