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
-
Install the component:
pip install --index-url https://test.pypi.org/simple/ --no-deps niivue-streamlit
-
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 controlsUnstyledCanvas: 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 datafilename(str): Displayed filenameoverlays(list[dict], optional): Overlay images listdata(bytes): Overlay dataname(str): Overlay namecolormap(str): Colormap (default: 'red')opacity(float): 0-1 (default: 0.5)
meshes(list[dict], optional): Mesh surfaces listdata(bytes): Mesh file dataname(str): Mesh filename (must include extension, e.g. 'lh.pial', 'brain.gii')overlays(list[dict], optional): Mesh overlays (curvature, thickness, etc.)data(bytes): Overlay dataname(str): Overlay filenamecolormap(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 Trueradiological(bool): default Falsecolorbar(bool): default Falseinterpolation(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: floatfilename: 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
- Volume-based: NIFTI (.nii, .nii.gz), DICOM (.dcm), MINC (.mnc, .mnc.gz), MHA/MHD, NRRD, MGH/MGZ
- Mesh-based: GIfTI (.gii), FreeSurfer (pial, white, inflated), MZ3 (.mz3), STL (.stl), Wavefront OBJ (.obj), PLY (.ply), BrainSuite DFS (.dfs), Legacy VTK (.vtk)
- Mesh Overlays: GIfTI (.gii), CIfTI-2 (.nii), MZ3 (.mz3), FreeSurfer (CURV, ANNOT), SMP, STC
- Tractography: TCK (.tck), TRK (.trk), TRX (.trx), VTK (.vtk)
๐๏ธ 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
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 niivue_streamlit-0.2.2b9.tar.gz.
File metadata
- Download URL: niivue_streamlit-0.2.2b9.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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b9fe30cfb6865a65ed78d616f4cce23bce6a88811b6d67516be1825d387c2b39
|
|
| MD5 |
0d386cc566ba0c8af85bb9db4a6e524d
|
|
| BLAKE2b-256 |
7d38c5a5d19db2764b86ca7384813f99c83953fb58479a98da1ca53ccc72a805
|
File details
Details for the file niivue_streamlit-0.2.2b9-py3-none-any.whl.
File metadata
- Download URL: niivue_streamlit-0.2.2b9-py3-none-any.whl
- Upload date:
- Size: 1.2 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
60eaac0dd2448bf36c892b47ed81b8892da81080731e0448778cd3c042b053b9
|
|
| MD5 |
76cbc161387b8e311c59c932683035ff
|
|
| BLAKE2b-256 |
c19dbf4cf4e16484dbfb758cd633d99dd0b37aafd8a802ad244739bb2c715150
|