TotalVariationImageFiltering.jl is a Julia package for total-variation (TV) denoising and
reconstruction on N-dimensional arrays.
Original implementation: GPUFilter.jl
Full manual: https://urlicht.github.io/TotalVariationImageFiltering.jl/
Recommended entry points:
- ROF denoising (
L2 + TV) with a Chambolle-style dual projected-gradient method - PDHG / Chambolle-Pock for
L2 + TVand PoissonKL + TV - PDHG primal constraints: non-negativity and box constraints
- Isotropic and anisotropic TV
- Overlapping group-sparse anisotropic TV for 2D images and 3D volumes
- Neumann and periodic boundaries
- Single-image and batched solves
- Automatic lambda selection for ROF (discrepancy principle and MC-SURE)
- Optional CUDA acceleration via package extension
From the registry:
] add TotalVariationImageFilteringFrom this repository:
julia --project=.From another Julia environment (local path):
import Pkg
Pkg.develop(path="/absolute/path/to/TotalVariationImageFiltering.jl")From a hosted repository:
import Pkg
Pkg.add(url="https://github.com/urlicht/TotalVariationImageFiltering.jl")using TotalVariationImageFiltering
f = rand(Float32, 128, 128)
problem = TotalVariationImageFiltering.TVProblem(
f;
lambda = 0.1f0,
data_fidelity = TotalVariationImageFiltering.L2Fidelity(),
tv_mode = TotalVariationImageFiltering.IsotropicTV(),
)
u, stats = TotalVariationImageFiltering.solve(problem, TotalVariationImageFiltering.ROFConfig())Group-sparse TV uses the low-memory ADMM/MM solver:
volume = rand(Float32, 96, 96, 64)
mode = TotalVariationImageFiltering.GroupSparseTV(3)
problem = TotalVariationImageFiltering.TVProblem(
volume;
lambda = 0.08f0,
tv_mode = mode,
)
u, stats = TotalVariationImageFiltering.solve(
problem,
TotalVariationImageFiltering.GSTVConfig(),
)Benchmark instructions and scripts are documented in benchmark/README.md.
import Pkg
Pkg.test()CUDA tests run only when CUDA is installed and functional.
MIT. See LICENSE.

