RadMarky Viewer is a lightweight Windows desktop application for reviewing 3D medical images and editing NIfTI label maps. It provides synchronized axial, sagittal, and coronal views, geometry-aware DICOM import, annotation comparison and editing, configurable validation, and still-image or animated export.
The application runs locally and is built with C++20, Qt 6, ITK, and VTK. It is intended for research, education, and software evaluation. RadMarky Viewer is not a certified medical device and must not be used as the sole basis for diagnosis or treatment.
Latest release candidate: RadMarky Viewer 1.0.0-rc.3 for Windows x64
This is a prerelease intended for testing and evaluation. Please report problems through GitHub Issues.
Users familiar with ITK-SNAP and other orthogonal medical-image viewers should feel at home with RadMarky's synchronized cursor, radiological display geometry, and dockable inspection panels. RadMarky Viewer is an independent project.
- Open one anatomical volume with File > Open Images, drag it into the window, or reopen it from Recent images.
- Add one or more NIfTI annotations with File > Open Annotations or by dropping NIfTI files onto an open image.
- Select a tool from the toolbar to navigate, change contrast, measure, paint, or erase. The controls beside the views expose window/level, annotations, labels, and cursor details.
- Select one label-map annotation and use Annotation > Save. Enabled validators run before the file is written.
Recent-image entries retain file-backed annotation layers, their opacity, and the active label. Missing files are reported rather than silently ignored.
- Open 3D NIfTI images (
.niiand.nii.gz). - Import loose DICOM files,
.ziparchives, and.tar.gzarchives, including archives containing nested folders. - Detect and separate multiple DICOM series before import, including distinct acquisitions that share a Series Instance UID.
- Review the detected series and select one consistent stack, or compatible parts sharing one Series Instance UID, to load.
- Validate slice position, orientation, dimensions, pixel spacing, frame of reference, duplicate instances, gaps, and stack uniformity before loading.
- Preserve uniform gantry tilt rather than flattening the image geometry.
- Search the loaded DICOM header in a key/value metadata table.
- Cancel long-running archive extraction or DICOM scanning.
- Reopen up to eight recent images from thumbnails and restore their saved annotation workspace.
- Navigate synchronized axial, sagittal, and coronal views with one crosshair.
- See physical LPS coordinates, continuous image indices, voxel intensity, and annotation values under the cursor.
- Inspect one voxel or statistics for a centered, visible-slice sample area from 3x3 through 17x17, with an on-image box showing the sampled area.
- Scroll through physical slices, drag per-view scrollbars, edit the displayed cursor/slice position numerically, or click and drag the shared cursor.
- Zoom, pan, center, resize, or temporarily focus any slice view.
- Measure physical distance in millimetres with an on-image ruler.
- Adjust window/level interactively or numerically; use CT soft-tissue, lung, bone, and brain presets; save custom presets and a default display range.
- Invert grayscale, switch between light and dark themes, and keep the viewer above other applications.
- Overlay multiple NIfTI label maps or scalar maps with independent opacity.
- Infer useful layer names from annotation file paths when possible.
- Compare two annotations: red is present only in the first, blue only in the second, green is the same non-zero value in both, and yellow marks conflicting non-zero values.
- Create a blank label map aligned to the anatomical image.
- Paint or erase in the axial view with active labels and paint-over rules.
Choose
Clear (Eraser)from the label selector to erase; every label and the eraser retain independent brush-size and paint-over choices across application runs. - Clear an 8-connected component on the current axial slice with scoped erase.
- Undo and redo complete brush, erase, or scoped-erase operations.
- Save edited label maps as
.niior.nii.gzwhile preserving image geometry. - Prompt to save or discard modified annotations before closing or replacing an image.
- Register, inspect, enable, disable, and remove Python annotation validators in Validation Management.
- Run enabled validators manually without saving, or automatically before every label-map save.
- Reject a save with a clear message and optionally move directly to the axial slice containing the issue.
- Start from bundled, disabled examples for non-empty, allowed-label, and slice continuity checks.
Validation scripts execute as separate processes with the current user's permissions; they are not sandboxed. Add only scripts you trust. The validator contract and interpreter discovery are documented in docs/VALIDATION.md.
- Save the current axial, sagittal, or coronal slice as PNG, JPEG, or BMP.
- Record a configurable physical range around the current slice as MP4 or GIF.
- Choose the view, playback speed, back-and-forth looping, current zoom/pan, and crosshair visibility. Visible annotation overlays are included.
RadMarky Viewer focuses on 2D orthogonal review and lightweight axial label-map editing. It does not currently provide a 3D volume or mesh view, registration, automated annotation, or oblique reformatting. Opening another anatomical volume closes the current annotation workspace after resolving unsaved edits.
Windows x64 with Visual Studio 2022 is the tested build configuration. The CMake project contains portable code paths, but other operating systems are not covered by repository presets or documented as supported.
- Windows x64
- CMake 3.25 or newer
- Visual Studio 2022 with the Desktop development with C++ workload
- Python 3.11 or newer
- vcpkg, bootstrapped locally
Set VCPKG_ROOT to your vcpkg checkout before configuring. Dependencies are
declared in vcpkg.json and include Qt, ITK, VTK, giflib, FFmpeg
with libx264, and libarchive. MP4 encoding uses the linked FFmpeg libraries; no
separate ffmpeg.exe is required. The first manifest install can take
considerable time because ITK and VTK are large C++ dependencies.
$env:VCPKG_ROOT = 'C:\path\to\vcpkg'
cmake --preset release
cmake --build --preset release --target radmarky_viewerThe executable is written to:
build/release/Release/radmarky_viewer.exe
After the initial configure has installed the dependencies, the helper script can build, test, and launch the existing Release tree:
.\build-release.ps1 -Test -Launch$env:VCPKG_ROOT = 'C:\path\to\vcpkg'
cmake --build --preset release --target ALL_BUILD
ctest --preset releaseThe test suite covers image geometry and physical transforms, NIfTI I/O, DICOM series validation, safe archive extraction, annotation comparison and editing, window/level behavior, settings and recent workspaces, cursor sampling, VTK orthogonal reslicing, animation export, Python validation, and related UI behavior.
The clang-tidy configuration is in .clang-tidy. The helper
reuses the existing Release vcpkg_installed tree and does not reconfigure
CMake or rebuild ITK or VTK:
.\tools\run-clang-tidy.ps1Add -Tests to include test sources. After CMake has been configured, the same
command is available as the clang_tidy target. The report is written to
build/clang-tidy/report.txt.
For repeatable DICOM loader measurements, build and run the manual benchmark. With no argument it generates a temporary 256x256x128 study; pass a directory to measure representative local data instead:
cmake --build --preset release --target radmarky_dicom_performance
.\build\release\tests\Release\radmarky_dicom_performance.exe
.\build\release\tests\Release\radmarky_dicom_performance.exe D:\path\to\studysrc/app/ Application metadata and persistent user settings
src/core/ Volumes, geometry, annotations, and viewer state
src/io/ NIfTI, DICOM, archive, GIF, and MP4 I/O
src/rendering/ ITK-to-VTK bridge, reslicing, overlays, and interactions
src/ui/ Qt windows, dialogs, themes, and tool panels
src/validation/ Python validation process and annotation validation service
tests/ Unit and integration-style CTest targets
resources/ Application artwork and bundled validation presets
The current design is documented in docs/ARCHITECTURE.md, prospective work is tracked in docs/ROADMAP.md, implementation rules are collected in docs/DEVELOPMENT.md, and the annotation validator contract is described in docs/VALIDATION.md.
Bug reports and feature requests are welcome as issues. Pull requests are reserved for existing project contributors or changes explicitly requested by a maintainer; unsolicited pull requests will be closed without review. See CONTRIBUTING.md for the project policy.
Do not include patient-identifiable medical data in issues, tests, or screenshots.
Report suspected vulnerabilities privately according to SECURITY.md.
RadMarky Viewer is licensed under the GNU General Public License v3.0. See LICENSE.
Copyright © 2026 TensorHarmony Technologies Inc.
This repository contains the desktop viewer only. The RadMarky name may later be used for a separate annotation platform; that product is not this application.




