OCIO still-image viewer for A/B comparison
Project description
Prism
(Pipeline Review and Image State Monitor)
Prism is a lightweight OCIO image viewer built for fast visual inspection, transform validation, and A/B comparison workflows.
It was created from a very practical need: quickly loading images, testing colorspace transforms, comparing outputs, and debugging OCIO behavior without having to launch a full compositing or grading application.
Prism focuses on still-image workflows and immediate visual feedback:
- compare two images side-by-side
- wipe between transforms
- inspect differences
- validate looks and context variables
- probe pixel values
- and quickly iterate on OCIO decisions
The goal is not to replace tools like Nuke, RV, or Resolve.
The goal is to provide a focused, lightweight environment for color pipeline inspection and experimentation, especially during look development, pipeline debugging, config validation, and day-to-day production support.
Built with:
- PySide6
- OpenColorIO
- OpenImageIO
- NumPy
Why Prism Exists
Many OCIO workflows still rely on launching large DCC applications just to validate a transform, compare two outputs, or debug context-dependent behavior.
Prism was built to reduce that friction.
It provides a fast standalone environment for inspecting color behavior directly, with minimal setup and immediate visual feedback.
Whether you're:
- validating an OCIO config
- checking a display transform
- comparing renders
- debugging context variables
- verifying looks
- or simply inspecting image data
Prism aims to make that process faster and more direct.
Features
- Load and compare two images simultaneously
- Apply independent OCIO transforms to A and B
- Compare images using Split, Wipe, Full, and Diff modes
- Inspect pixel values directly in the viewer HUD
- Adjust exposure and luminance interactively
- Edit OCIO context variables live
- Inspect LUT transfer curves in a dedicated modeless LUT window
- Inspect waveform scopes in a dedicated modeless waveform monitor
- Navigate synchronized A/B views
- Toggle transform bypass per image
- Use EXR, DPX, JPG, PNG, TIFF, and other common formats
- Built-in diagnostics window for environment validation
Requirements
-
Python 3.11 through 3.14
-
Runtime packages:
PySide6OpenImageIOOpenColorIOnumpyscipy1.17 or newer, below 2.0colour-science0.4.7 or newer, below 0.5
Install
Windows desktop build
A prebuilt Windows desktop build is available from the GitHub Releases page.
Download:
Prism-1.2.2-windows-x64.zip
Extract the zip, then run:
Prism\Prism.exe
No Python setup is required for the prebuilt Windows package.
Install from PyPI
python -m pip install prism-viewer
Install for Development:
python -m pip install -e .
Launch
For the Windows desktop build, run:
Prism\Prism.exe
For Python installs, run:
prism
If the command is not found, activate your virtual environment first and retry.
Quick Start
- Open image A from
File -> Open Image A... - Open image B from
File -> Open Image B... - Load an OCIO config from
File -> Open OCIO Config...
- Select Input and Output colorspaces independently for A and B
- Optionally select a Look
- Switch compare modes (
Split,Wipe,Full (A),Full (B)Diff)
- Hover over the viewer to inspect pixel values in the footer HUD
Prism also supports drag-and-drop for images and OCIO configs.
Compare Modes
Split
Shows A and B side-by-side.
Useful for:
- framing comparisons
- look validation
- general A/B review
Wipe
Displays A/B across an interactive divider.
Use the wipe handle to inspect transitions and subtle image differences interactively.
Full
Displays only the currently selected side (A or B).
Useful for focused single-image inspection while preserving the compare setup.
Diff
Displays grayscale absolute difference between overlapping regions.
Brighter values indicate stronger differences.
Useful for:
- transform validation
- render verification
- subtle change detection
OCIO Context Variables
Prism can detect and expose OCIO context variables directly from the loaded config.
Open from:
View -> OCIO Context Variables- Hotkey:
E
Behavior:
- Hidden by default
- Dynamically rebuilds from the loaded config
- Updates processing live as values change
- Can be docked or undocked
- Persists current values while visible or hidden
This is especially useful for:
- shot-based transforms
- context-driven looks
- sequence-dependent processing
- debugging OCIO environment behavior
Viewer Controls
Exposure and Luminance
Interactive controls allow quick image inspection without modifying source data.
Useful for:
- shadow inspection
- highlight clipping checks
- transform debugging
- general image evaluation
Background Presets
Open from:
View -> Background
Presets:
- Black
- Dark Gray
- Mid Gray
- Light Gray
Useful when image edges become difficult to read against the viewer background.
LUT Inspection
Open from:
View -> LUT InspectionorDrop LUT in main_window
Behavior:
- opens as a modeless utility window
- accepts drag-and-drop LUT files
- supports
.cube,.spi1d,.csp,.spi3d,.lut, and.3dlformats - plots LUT curves on an X/Y diagram that scales with window size
- for 3D LUTs, displays a neutral-axis projection (
R=G=Bsamples) - for
.cube,DOMAIN_MINandDOMAIN_MAXmust use matching RGB components (mixed per-channel domain values are treated as unsupported) - reports summary metrics including sample count, channel count, output min/max, out-of-range status, monotonicity, and CSP shaper status when available
- keeps summary analysis in core helpers and rendering in the UI layer
- uses SciPy-backed trilinear sampling for shaped CSP-style 3D LUT neutral-axis inspection, while direct lattice extraction is preserved for unshaped 3D LUT neutral axes
- does not currently display Colour/Delta E metrics; arbitrary LUT files do not provide a reliable source/target colourspace contract, so perceptual metrics are deferred until a dedicated colour-metrics workflow can state its assumptions explicitly
Waveform Monitor
Open from:
View -> Monitoring -> Waveform Monitor
Behavior:
- opens as a modeless utility window
- inspects each side's float RGB analysis buffer:
- post-OCIO output when a transform is active
- loaded source data when transform setup is incomplete or bypassed
- before global exposure/luminance and channel-view presentation controls
- source modes mirror main viewer compare naming:
Full (A)Full (B)Split
- source mode is synchronized with main compare mode for supported modes:
- changing mode in waveform updates main viewer mode
- changing main viewer mode updates waveform mode
- opening waveform initializes from current main mode
- this is intentional: the waveform monitor can be used as a compact control surface for changing the active viewer comparison state
WipeandDiffare currently unsupported in waveform mode mapping:- waveform shows blank graphs with an explicit unsupported-mode message
- signal display options:
RGBRGB ParadeRGB OverlayY'with selectableBT.709orBT.2020encoded-signal weights- defaults to
BT.709 - the standard is selected explicitly and is not inferred from OCIO names
Y'is an encoded weighted signal, not scene-linear or absolute luminance
- defaults to
- applies a small SciPy Gaussian filter to rendering copies for trace readability; raw waveform density data remains unchanged
- supports drag-and-drop image loading directly from waveform:
Full (A)drops load sideAFull (B)drops load sideBSplitdrops route by pane (left -> A,right -> B)- dropped images are loaded into the main viewer, so waveform and viewer state remain synchronized
Diagnostics
Prism includes a diagnostics window for quickly validating runtime dependencies and OCIO environment state.
Includes:
- Prism version
- Python version
- Qt / PySide version
- NumPy version
- OpenImageIO version
- OpenColorIO version
- Active OCIO config
- Platform information
Useful for:
- support,
- debugging,
- pipeline validation,
- environment troubleshooting.
Typical Workflows
A/B Grade Validation
- Load image A and B
- Load an OCIO config
- Configure Input and Output transforms
- Start in
Split - Move to
Wipefor edge comparison - Use
Diffto isolate subtle changes
Single Image Inspection
- Load image A
- Configure transforms
- Switch to
Full - Inspect pixel values and channels
- Adjust exposure and luminance interactively
Context-Based Look Debugging
- Load image and OCIO config
- Open
View -> OCIO Context Variables - Modify context values
- Observe updates live in the viewer
Hotkeys
-
FFit to Window -
HShow/Hide Hotkeys dialog -
EToggle OCIO Context Variables dock -
TabSwitch active side A/B -
Right/PageDownNext frame -
Left/PageUpPrevious frame -
Up/DownChange focused Input/Output item -
RToggle Red solo / RGB -
GToggle Green solo / RGB -
BToggle Blue solo / RGB -
ZRestore RGB -
1 / 2 / 3 / 4 / 5- Split
- Wipe
- Full (A)
- Full (B)
- Diff
-
Right Click + DragPan
Sample Assets
Prism includes sample files to validate setup quickly:
- Sample images:
samples/images/ - Sample OCIO config:
samples/ocio_config/ - Sample LUTs:
sample/LUTs
Quick smoke test:
- Launch
prism - Load image A and B from
samples/images/ - Load config from
samples/ocio_config/ - Switch between
Split,Wipe,Full (A),Full (B), andDiff
Troubleshooting
prism command not found
Activate the intended virtual environment and reinstall from repository root:
python -m pip install -e .
OCIO config fails to load
- Confirm
OpenColorIOis installed in the active environment - Confirm the selected file is a valid
.ocioconfig - If loading is canceled intentionally, Prism preserves current state
EXR or DPX images fail to load
Prism uses OpenImageIO fallback support for formats that may not be available through Qt directly.
Verify:
OpenImageIOis installed- the active environment can import it successfully
Movie source issues
Movie playback depends on optional backend availability such as:
opencv-pythonimageio[ffmpeg]
Still-image workflows remain fully functional without them.
Known Limitations
- Movie workflows remain backend/environment dependent
- Some EXR/DPX workflows rely on OpenImageIO fallback support
- Windows taskbar icon refresh may lag behind icon updates until Explorer refreshes shell cache
Planned Features
- Vectorscope
- Chromaticity Diagram and gamut visualization
- Transform breakdown visualization
- Nuke integration
- Resolve integration
- More Display/View support
Architecture and Developer Docs
See docs/README.md for subsystem and architecture documentation:
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file prism_viewer-1.2.2.tar.gz.
File metadata
- Download URL: prism_viewer-1.2.2.tar.gz
- Upload date:
- Size: 853.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5bc3b4da9ffae13db2f50e1b01275457f8871358cb1fdc8e31e4ba6b59d9a05e
|
|
| MD5 |
da50f35435ba32a8cd3d154b09e06a03
|
|
| BLAKE2b-256 |
6e99bf09f60601eed2c8576e3dad257d64ae286270587ec7d8056ec00736ffd4
|
File details
Details for the file prism_viewer-1.2.2-py3-none-any.whl.
File metadata
- Download URL: prism_viewer-1.2.2-py3-none-any.whl
- Upload date:
- Size: 841.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bb717a5cb115f4c32a34e0a2c5561cc411f44f1fd162efe24acfb0928fa7b0ac
|
|
| MD5 |
b0da4849fa3c948969809aab3f302e02
|
|
| BLAKE2b-256 |
2c08a00b546f897025fd3d2b211b4a49740c3dabb4d6334cf8ffaf11deefc4ed
|