Skip to main content

A Streamlit component for NiiVue neuroimaging viewer

Project description

NiiVue Streamlit Component

A modern Streamlit component for visualizing neuroimaging data using NiiVue, built with TypeScript, Preact, and Vite.

๐Ÿš€ Quick Start

Simple Installation & Usage

  1. Install the component:

    pip install --index-url https://test.pypi.org/simple/ --no-deps niivue-streamlit
    
  2. Use in your Streamlit app:

    import streamlit as st
    from niivue_component import niivue_viewer
    
    uploaded_file = st.file_uploader("Choose a NIFTI file", type=["nii", "nii.gz"])
    
    if uploaded_file is not None:
        result = niivue_viewer(
            nifti_data=uploaded_file.getvalue(),
            filename=uploaded_file.name,
            height=700
        )
    
        # Handle click events
        if result:
            st.write(f"Clicked voxel: {result['voxel']}, Value: {result['value']}")
    

โœจ Features

  • ๐ŸŽจ Two Component Modes:
    • StyledViewer: Full-featured viewer with interactive menu and controls
    • UnstyledCanvas: Minimal canvas-only viewer for embedding
  • ๐Ÿ”„ Multiple View Modes:
    • Axial, Coronal, Sagittal slices
    • 3D render view
    • Multiplanar view with render
  • ๐Ÿ“Š Advanced Capabilities:
    • Multiple overlay images with custom colormaps
    • Surface mesh rendering (FreeSurfer pial, white, inflated, GIfTI, STL, OBJ, etc.)
    • Mesh overlays (curvature, thickness, annotations)
    • Combined volume + mesh visualization
    • Configurable display settings (crosshair, radiological convention, colorbar, interpolation)
    • Bidirectional communication (click events from viewer to Python)
    • DICOM support

๐Ÿ“– Advanced Usage

With Overlays

from niivue_component import niivue_viewer

result = niivue_viewer(
    nifti_data=main_image_bytes,
    filename="brain.nii.gz",
    overlays=[
        {
            "data": overlay_bytes,
            "name": "activation.nii.gz",
            "colormap": "hot",
            "opacity": 0.7
        }
    ],
    view_mode="multiplanar",
    styled=True,
    settings={
        "crosshair": True,
        "radiological": False,
        "colorbar": True,
        "interpolation": True
    },
    height=800
)

With Mesh Surfaces

from niivue_component import niivue_viewer

# Load a FreeSurfer surface mesh
mesh_data = open("lh.pial", "rb").read()

result = niivue_viewer(
    meshes=[{
        "data": mesh_data,
        "name": "lh.pial",
    }],
    view_mode="3d",
    height=700
)

Mesh with Overlays (Curvature, Thickness)

mesh_data = open("lh.pial", "rb").read()
thickness_data = open("lh.thickness", "rb").read()

result = niivue_viewer(
    meshes=[{
        "data": mesh_data,
        "name": "lh.pial",
        "overlays": [{
            "data": thickness_data,
            "name": "lh.thickness",
            "colormap": "redyell",
            "opacity": 0.7
        }]
    }],
    view_mode="3d",
    height=700
)

Volume with Mesh

# Display a volume image alongside a surface mesh
volume_data = open("brain.nii.gz", "rb").read()
mesh_data = open("lh.pial", "rb").read()

result = niivue_viewer(
    nifti_data=volume_data,
    filename="brain.nii.gz",
    meshes=[{
        "data": mesh_data,
        "name": "lh.pial",
    }],
    view_mode="3d",
    height=700
)

Minimal Viewer (No Menu)

# Perfect for embedding in complex layouts
result = niivue_viewer(
    nifti_data=image_bytes,
    filename="scan.nii",
    styled=False,  # Hide menu
    view_mode="axial",
    height=400
)

๐Ÿ“š API Reference

niivue_viewer()

Parameters:

  • nifti_data (bytes, optional): Raw NIFTI file data
  • filename (str): Displayed filename
  • overlays (list[dict], optional): Overlay images list
    • data (bytes): Overlay data
    • name (str): Overlay name
    • colormap (str): Colormap (default: 'red')
    • opacity (float): 0-1 (default: 0.5)
  • meshes (list[dict], optional): Mesh surfaces list
    • data (bytes): Mesh file data
    • name (str): Mesh filename (must include extension, e.g. 'lh.pial', 'brain.gii')
    • overlays (list[dict], optional): Mesh overlays (curvature, thickness, etc.)
      • data (bytes): Overlay data
      • name (str): Overlay filename
      • colormap (str): Colormap (default: 'redyell')
      • opacity (float): 0-1 (default: 0.7)
  • height (int): Height in pixels (default: 600)
  • view_mode (str): 'axial', 'coronal', 'sagittal', '3d', 'multiplanar' (default)
  • styled (bool): Show menu (default: True)
  • settings (dict, optional):
    • crosshair (bool): default True
    • radiological (bool): default False
    • colorbar (bool): default False
    • interpolation (bool): default True
  • key (str, optional): Component key

Returns:

dict or None with click event data:

  • type: 'voxel_click'
  • voxel: [x, y, z]
  • mm: [x, y, z]
  • value: float
  • filename: str

๐Ÿ› ๏ธ Development

Dev mode (live reload)

In dev mode, the Python package points to a local Vite dev server instead of built files.

Terminal 1 โ€” start the frontend dev server (port 3001):

pnpm dev

Terminal 2 โ€” run the example app with the dev flag:

NIIVUE_DEV=1 streamlit run app.py

The frontend hot-reloads on changes.

Production mode (built files)

Build the frontend first, then run Streamlit normally:

pnpm build
streamlit run app.py

_RELEASE = True (the default) serves from niivue_component/frontend/build/.

Running Examples

# Simple example
streamlit run app.py

# Advanced example with all features
streamlit run app_advanced.py

๐Ÿ“ Supported Formats

๐Ÿ—๏ธ Architecture

niivue_component/
โ”œโ”€โ”€ __init__.py                 # Python API
โ”œโ”€โ”€ frontend/
โ”‚   โ”œโ”€โ”€ src/
โ”‚   โ”‚   โ”œโ”€โ”€ components/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ StyledViewer.tsx
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ UnstyledCanvas.tsx
โ”‚   โ”‚   โ”œโ”€โ”€ types.ts
โ”‚   โ”‚   โ””โ”€โ”€ utils.ts
โ”‚   โ”œโ”€โ”€ vite.config.ts
โ”‚   โ””โ”€โ”€ package.json
โ””โ”€โ”€ build/                      # Compiled assets (generated, not in git)

๐Ÿ”ง Building for Distribution

Build files are not committed to git. To prepare the Python package for release:

pnpm build
python -m build

This compiles frontend assets into niivue_component/frontend/build/, which is then bundled into the Python package.

๐Ÿ“„ License

BSD-2-Clause

๐Ÿ™ Credits

Built on top of:

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

niivue_streamlit-0.2.2b12.tar.gz (1.2 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

niivue_streamlit-0.2.2b12-py3-none-any.whl (1.2 MB view details)

Uploaded Python 3

File details

Details for the file niivue_streamlit-0.2.2b12.tar.gz.

File metadata

  • Download URL: niivue_streamlit-0.2.2b12.tar.gz
  • Upload date:
  • Size: 1.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for niivue_streamlit-0.2.2b12.tar.gz
Algorithm Hash digest
SHA256 6bf5f913f4c1a96256a4dcda255e01a64168dec499efc04a18ba3266516a2bb1
MD5 da2a1f36d47e7f77c731f368d68c1876
BLAKE2b-256 c78e99406e9d6a03bd8990b0ab108d342d7c174ded6bb04bcc4b989298ef17cd

See more details on using hashes here.

File details

Details for the file niivue_streamlit-0.2.2b12-py3-none-any.whl.

File metadata

File hashes

Hashes for niivue_streamlit-0.2.2b12-py3-none-any.whl
Algorithm Hash digest
SHA256 afb9f2186b926234660f546b0614a6248cc49ec97f488bce70bce48818f9eec3
MD5 b4b594b730409a0ed7f7b1d5cd642564
BLAKE2b-256 1474ab2b5050f51be4e30cbd3254b26bee997137ce205004f8180791f6a40ed5

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page