Skip to main content

Build Status OpenSSF Best Practices Documentation Status PyPI Crates.io DOI

BM3D ORNL

BM3D ORNL removes streak and ring artifacts from neutron-imaging sinograms. BM3D means block-matching and three-dimensional filtering.

The BM3D algorithm was originally proposed by K. Dabov, A. Foi, V. Katkovnik, and K. Egiazarian in the paper "Image Denoising by Sparse 3D Transform-Domain Collaborative Filtering" (2007).

The library provides a Python API backed by Rust. Key features include:

  • Streak removal targets vertical detector artifacts.
  • Multiscale processing handles streaks wider than one scale can capture.
  • Fourier-SVD combines frequency detection with rank-one matrix decomposition.
  • Stack processing batches three-dimensional sinogram data.
  • Rust processing accelerates block matching and transforms.

Documentation

Full documentation: https://bm3dornl.readthedocs.io

It covers the installation guide, a tutorial, the parameter reference, the GUI guide, and the API reference.

How to install

Use pip for published releases and Pixi for a clone.

Do not run pip install -e . in a clone. It is unsupported: Pixi pins every dependency in pixi.lock, and pip resolves its own set. pixi run build compiles the Rust extension and installs the package in editable mode.

The [gui] extra installs the separate bm3dornl-gui binary wheel from PyPI. It does not build the GUI in a clone. Run the clone's GUI with pixi run gui.

Using Pip (released packages)

# Core library only
pip install bm3dornl

# With GUI application
pip install bm3dornl[gui]

Supported Platforms

Platform Architecture Library GUI
Linux x86_64 ✅ ✅
macOS ARM64 (Apple Silicon) ✅ ✅

Usage

from bm3dornl import bm3d_ring_artifact_removal
import numpy as np

# Load sinogram data - 2D (H, W) or 3D stack (N, H, W)
sinogram = np.load("sinogram.npy")

# Standard BM3D denoising (generic white noise)
denoised = bm3d_ring_artifact_removal(sinogram, mode="generic", sigma_random=0.1)

# Streak artifact removal (recommended for ring artifacts)
denoised = bm3d_ring_artifact_removal(sinogram, mode="streak", sigma_random=0.1)

# With custom parameters (all parameters are flat, no dict wrapping)
denoised = bm3d_ring_artifact_removal(
    sinogram,
    mode="streak",
    sigma_random=0.1,
    patch_size=8,           # Patch size (7 or 8 recommended)
    step_size=4,            # Stride between reference patches
    search_window=40,       # Max search distance
    max_matches=64,         # Similar patches per 3D group
    batch_size=32,          # Batch size for stack processing
)

# Multi-scale BM3D for wide streaks (v0.7.0+)
denoised = bm3d_ring_artifact_removal(
    sinogram,
    mode="streak",
    multiscale=True,        # Enable multi-scale pyramid processing
    num_scales=None,        # Auto-detect (or set explicitly)
    filter_strength=1.0,    # Filtering intensity multiplier
)

Fourier-SVD Method (v0.7.0+)

For an alternative streak-removal method:

from bm3dornl.fourier_svd import fourier_svd_removal

# Fourier-guided streak removal
denoised = fourier_svd_removal(
    sinogram,
    fft_alpha=1.0,          # Weight for detected vertical-frequency energy
    notch_width=2.0,        # Gaussian notch width in frequency bins
)

Performance

Processing time for one 720×725 sinogram, mean of 100 runs (measured 2026-08-31 and 2026-09-02):

Method Linux x86_64, 24-core Threadripper Apple M2 Max laptop
bm3dornl, streak mode 0.094 s 0.20 s
bm3dornl, Fourier-SVD 0.017 s 0.022 s
bm3d-streak-removal (reference, x86_64 only) 31.8 s not available

The Rust backend runs in parallel across cores with Rayon. The benchmark study behind these numbers, including the TomoPy comparison, lives on the feature/joss-paper branch under study/. A smaller comparison notebook is notebooks/evaluation_performance.ipynb.

Key optimizations:

  • Integral image pre-screening for fast block matching
  • Early termination in distance calculations
  • Pre-computed FFT plans
  • Fast Walsh-Hadamard transform for 8×8 patches

Development

Use Pixi for every command in a clone. See How to install for the install policy. Pixi supplies Python, Maturin, HDF5, and the other build dependencies. It does not supply Rust: install a stable Rust toolchain with rustup first, so that cargo is on your PATH.

Task Command
Create the environment without running a task (optional) pixi install
Build the Rust extension pixi run build
Run all tests (Rust and Python) pixi run test
Lint (rustfmt and clippy) pixi run lint
Run the clone's GUI pixi run gui (release build) or pixi run gui-debug
Run the benchmarks pixi run bench

Clone the repository, enter its directory, then run pixi run build, pixi run test, and pixi run gui, in that order.

# Prerequisites: Pixi and a stable Rust toolchain (rustup)
git clone https://github.com/ornlneutronimaging/bm3dornl.git
cd bm3dornl
pixi run build
pixi run test
pixi run gui

Each pixi run command installs the environment on demand. Run pixi install first only when you want to create the environment separately.

The first pixi run gui compiles the GUI application, which takes a few minutes; later runs start immediately.

Optional: test-data submodule

tests/bm3dornl-data is a Git submodule with notebook reference data. It is not required to build the package or run tests. The clone command above is enough for pixi run build and pixi run test.

Fetch it only if you want to run the notebooks:

git submodule update --init tests/bm3dornl-data
git -C tests/bm3dornl-data lfs pull

The submodule is hosted on code.ornl.gov. It clones anonymously over HTTPS, without an ORNL account or SSH key. The tomostack_small.h5 file is about 1.4 GB. It uses Git Large File Storage (Git LFS). Without Git LFS, the file remains a small text pointer. The lfs pull step can take time.

GUI Application

BM3DORNL includes a standalone GUI application for interactive ring artifact removal.

Installation

Released binaries (Linux x86_64 and macOS Apple Silicon):

pip install bm3dornl[gui]

Or install the GUI separately:

pip install bm3dornl-gui

In a clone, run the GUI through Pixi. See How to install.

pixi run gui

Launching

The released binary installs a bm3dornl-gui command:

bm3dornl-gui

Features

  • Load HDF5 files with tree browser for dataset selection
  • Interactive slice viewer with histogram
  • Side-by-side comparison of original and processed images
  • Adjust parameters before processing
  • View the processed result after processing finishes
  • ROI selection for histogram (Shift+drag to select region)
  • Export processed data to TIFF or HDF5

Keyboard Shortcuts

Shortcut Action
Shift+Drag Select ROI for histogram
Scroll Zoom in/out on image
Drag Pan image

Parameter Reference

Parameter Default Description
mode "streak" "generic" for white noise, "streak" for ring artifacts
sigma_random 0.1 Noise standard deviation
patch_size 8 Patch size (7 or 8 recommended)
step_size 4 Stride between reference patches. It must not exceed patch_size, or pixels between the patches would stay unfiltered
search_window 24 Maximum search distance for similar patches
max_matches 16 Maximum similar patches per 3D group
search_step None Stride between candidate positions in the block-matching search. None uses 1 (every position) in generic mode and step_size in streak and multiscale modes. Generic mode used to search with step_size; search_step=step_size restores that output and speed. The default generic search takes 2 to 3 times as long at the default search_window, and more with a larger window
batch_size 32 Batch size for stack processing
streak_sigma_smooth 3.0 Smoothing for streak mode (streak mode only)
multiscale False Enable multi-scale processing for wide streaks
num_scales None Number of scales (None selects it automatically)
filter_strength 1.0 Filtering strength multiplier for multi-scale
debin_iterations 30 Cubic-spline expansion iterations for multiscale corrections

Fourier-SVD Parameters

Parameter Default Description
fft_alpha 1.0 Weight for detected vertical-frequency energy
notch_width 2.0 Gaussian notch width in frequency bins

Contributing and Support

Metadata

Release files for bm3dornl 0.12.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for bm3dornl 0.12.0
File Size Uploaded
bm3dornl-0.12.0.tar.gz 164.1 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for bm3dornl 0.12.0
File
bm3dornl-0.12.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.17+ x86-64 Details
bm3dornl-0.12.0-cp314-cp314-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 macOS 11.0+ ARM64 Details
bm3dornl-0.12.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.17+ x86-64 Details
bm3dornl-0.12.0-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details
bm3dornl-0.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.17+ x86-64 Details
bm3dornl-0.12.0-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details

Total release size: 7.4 MB

Release files / bm3dornl-0.12.0.tar.gz

Download URL bm3dornl-0.12.0.tar.gz
Size 164.1 kB
Tags Source
SHA-256 checksum
How to use checksums
a47bf9b2cf399e34a552ceb3dad302818edcbaf24eb46f816b811b9bfea6658e
BLAKE2b-256 checksum
How to use checksums
002d27558840c633740049688c92e80c2e4e342aa0b54860dbad268620a01109
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / bm3dornl-0.12.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL bm3dornl-0.12.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 1.5 MB
Tags CPython 3.14 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
ae35dbf240bd8243b9ada8c8fefaad176bba4b55dbac0c846110bc534876443a
BLAKE2b-256 checksum
How to use checksums
8f5801f9f23a67d5d8687d1e98a74d907a5b8a7ffcac9dbd281f33b732e6eb75
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / bm3dornl-0.12.0-cp314-cp314-macosx_11_0_arm64.whl

Download URL bm3dornl-0.12.0-cp314-cp314-macosx_11_0_arm64.whl
Size 958.0 kB
Tags CPython 3.14 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
600d67dfd7d79b89f47c450aee97782714fe56f675ad4fd6e9eee71eaad5dd32
BLAKE2b-256 checksum
How to use checksums
62eeffc1b0d91564a023cfdb5a8ac16540e10c4582aab8837607243c9f2c8a9d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / bm3dornl-0.12.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL bm3dornl-0.12.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 1.5 MB
Tags CPython 3.13 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
44d063f36e6b9a42581ba706dbcaf4f93b9571b6f53317e70a8b49e324644819
BLAKE2b-256 checksum
How to use checksums
4a6b455939728466406dce3aa01ec3da365bea3d03edf6c6e6437c091f0bae20
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / bm3dornl-0.12.0-cp313-cp313-macosx_11_0_arm64.whl

Download URL bm3dornl-0.12.0-cp313-cp313-macosx_11_0_arm64.whl
Size 958.0 kB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
1a369052ac1b6b46d76b232f56bea020badb43eceb79ef2587deed7c71f7c4a4
BLAKE2b-256 checksum
How to use checksums
0012dae3b2e9de784336aa79914a2a4ca3ff2a09ebf5185944546fe43dad2a3d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / bm3dornl-0.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL bm3dornl-0.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 1.5 MB
Tags CPython 3.12 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
bd5bff2f8c786a30e10f2ed8a75fc5b3c9e2fa81e8e8e78e5c56d21c80924939
BLAKE2b-256 checksum
How to use checksums
7116b3cd791b475ed4072203e83bce6cdc73cbdef3f4074440de53ff5260c92a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / bm3dornl-0.12.0-cp312-cp312-macosx_11_0_arm64.whl

Download URL bm3dornl-0.12.0-cp312-cp312-macosx_11_0_arm64.whl
Size 958.1 kB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
64e1cffc4184d8d933b53cda62ecd38c791280592349061d912fdff65cb29464
BLAKE2b-256 checksum
How to use checksums
acbf90078f80d5fee5ceb2d4f8e202f681153116fe87ea4c83729895e8eb72e1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.12.0 This release

7 release files

0.10.0

7 release files

0.9.0

7 release files

0.8.2

7 release files

0.8.1

3 release files

0.7.1

3 release files

0.7.0

3 release files

0.6.4

3 release files

0.6.3

3 release files

0.6.1

3 release files

0.6.0

3 release files

0.5.3

3 release files

0.5.2

2 release files

0.3.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page