Terminal-based medical image viewer for DICOM, NRRD, and Nifti formats with high-quality graphics rendering.
demo.mp4
pip install pydcmviewpydcmview <path_to_image_file_or_dicom_directory>When using over remote SSH, I've only gotten advanced graphics rendering to work with kitty with the following remote SSH command
kitty +kitten ssh <typical_ssh_arguments_here>e.g., kitty +kitten ssh -p 6000 my_server_address
With other remote SSH connections, it falls back to Unicode block rendering. Adjust the terminal font zoom to increase/decrease rendering resolution. Each character block represents 2 pixels.
- Format Support: DICOM, NRRD, and Nifti formats
- High-Quality Rendering: Uses textual-image with Sixel and Kitty graphics protocols for superior image quality
- 2D Slice Viewing: Navigate through N-dimensional images slice by slice
- Interactive Dimension Selection: Overlay-based dimension selection with axis assignment and flipping
- WASD Scrolling: Pan across images with 5% step size, zoom-aware navigation
- Zoom Controls: Zoom in/out functionality with scroll position preservation (0.01x to 20.0x)
- Crosshair Mode: Interactive crosshair with adjustable opacity and pixel intensity display
- Window/Level Adjustment: Percentage-based contrast and brightness control (1% and 5% increments)
- Colormap Selection: Multiple colormap options for enhanced visualization
- Smart Navigation: Arrow keys and vim motion keys supported throughout
- Comprehensive Status Bar: Real-time display of image info, coordinates, and available commands
q: Quit application↑/↓orj/k: Navigate through slicesw/a/s/d: Scroll image (up/left/down/right) - 5% of image size per stept: Toggle dimension selection overlayc: Enter colormap selectionh: Enter crosshair modeShift+W: Enter window/level mode[/]: Zoom out/in (preserves scroll position)
↑/↓orj/k: Navigate dimensionsx: Assign dimension to X-axis (swaps if already assigned to Y)y: Assign dimension to Y-axis (swaps if already assigned to X)f: Toggle flip for selected dimension (marked with *)Enter: Confirm and apply changesEsc: Cancel and return to normal mode
↑/↓/←/→orh/j/k/l: Move crosshair positionShift+↑/↓orJ/K: Adjust crosshair opacityEsc: Exit crosshair mode
↑/↓orj/k: Adjust window width (1% of intensity range)←/→orh/l: Adjust window center/level (1% of intensity range)Shift+↑/↓orJ/K: Adjust window width (5% of intensity range)Shift+←/→orH/L: Adjust window center/level (5% of intensity range)Esc: Exit window/level mode
- Primary: textual-image library with Terminal Graphics Protocol support
- Fallback: Unicode block characters for broader terminal compatibility
- Graphics Protocols: Sixel (xterm, mintty) and Kitty graphics for high-resolution display
- WASD Scrolling: 5% of image dimensions per step, scaled with zoom level
- Zoom Preservation: Scroll position maintained during zoom operations with bounds checking
- Zoom Range: 0.01x to 20.0x with nearest-neighbor interpolation for medical accuracy
- Smart Constraints: Automatic scroll boundary enforcement to prevent out-of-bounds navigation
- Dynamic axis assignment for N-dimensional data
- Independent dimension flipping with visual indicators
- Automatic slice axis calculation for 3D+ datasets
- Python 3.8+
- textual>=0.70.0
- textual-image>=0.3.0 (replaces rich-pixels for better graphics)
- SimpleITK>=2.3.0
- numpy>=1.21.0
- pydicom>=2.3.0
- Pillow>=8.0.0
- Migrated from rich-pixels to textual-image for superior rendering quality
- Added support for Sixel and Kitty terminal graphics protocols
- Maintained backward compatibility with Unicode block rendering
- WASD Scrolling: Added image panning with percentage-based movement (5% of image size)
- Zoom Position Preservation: Zoom operations now maintain current view position with bounds checking
- Improved Window/Level: Percentage-based adjustments (1% and 5%) relative to image intensity range
- Colormap Integration: Multiple colormap options for enhanced medical image visualization
- Extended Zoom Range: Increased zoom capability from 5.0x to 20.0x maximum
- Real-time status bar updates with zoom level and opacity display
- Context-sensitive key binding hints
- Smooth overlay transitions with semi-transparent backgrounds
- Improved dimension swapping logic for intuitive axis assignment
Best Experience:
- Kitty terminal (full graphics protocol support)
- iTerm2 (with graphics support)
- xterm with Sixel support
Good Experience:
- Most modern terminals (Unicode block fallback)
- Windows Terminal
- GNOME Terminal
- Terminal.app (macOS)