Skip to main content

Curvelets

Curvelets is an open-source implementation of the Uniform Discrete Curvelet Transform (UDCT) in the Python programming language for N-dimensional signals.

Getting Started | Features | FAQs | Examples

Actions Status Documentation Status codecov

PyPI version PyPI downloads OS-support License

GitHub Discussion

Getting Started

Installation

Curvelets can be installed directly from the PyPI index:

pip install curvelets

Curvelets supports Python 3.9 and above, NumPy 1.20 and above.

First Steps

Curvelets provides a very simple interface to use the UDCT, UDCT. Its only required argument is the shape of the inputs, but you can also supply the number of "scale" or "resolutions" (num_scales) as well as the number of wedges per direction (wedges_per_direction). The more scales there are, the more granular the distinction between a slowly-varying and a highly-varying feature. The more wedges there are, the more granular the distinction between the directions of the features. Explore the direction resolution example to better understand the effect of the scales and the wedges on the decomposition.

import numpy as np
from curvelets.numpy import UDCT

x = np.ones((128, 128))
C = UDCT(shape=x.shape)
y = C.forward(x)
np.testing.assert_allclose(x, C.backward(y))

Features

Feature Status
N-D ✅
Arbitrary input shapes ✅
Real inputs ✅ 1
Complex inputs ✅
Asymmetric diretionality ✅ 2
Wavelet at highest scale ✅ 3
Monogenic coefficients ✅ 4
PyTorch bindings ✅ 5

FAQs

What are curvelets?

Curvelets have a long history and rich history in signal processing. They have been used for a multitude of tasks related in areas such as biomedical imaging (ultrasound, MRI), seismic imaging, synthetic aperture radar, among others. They allow us to extract useful features which can be used to attack problems such as segmentation, inpaining, classification, adaptive subtraction, etc.

You can find a good overview (disclaimer: I wrote it!) of curvelets in the Medium article Demystifying Curvelets.

Curvelets are like wavelets, but in 2D (3D, 4D, etc.). So are steerable wavelets, Gabor wavelets, wedgelets, beamlets, bandlets, contourlets, shearlets, wave atoms, platelets, surfacelets… you get the idea. Like wavelets, these "X-lets" allow us to separate a signal into different "scales" (analog to frequency in 1D, that is, how fast the signal is varying), "location" (equivalent to time in 1D, that is, where the signal is varying), and the direction in which the signal is varying (no 1D analog).

What separates curvelets from the other X-lets are their interesting properties, including:

  • The curvelet transform has an exact inverse,
  • Forward and inverse discrete curvelet transforms are efficient [1, 2],
  • The curvelet transform is N-dimensional,
  • Curvelets are optimally sparse for wave phenomena (seismic, ultrasound, electromagnetic, etc.) [3],
  • Curvelets have little redundancy, forming a tight frame [4, 2, 7].

Why do we need another curvelet transform library?

There are three flavors of the discrete curvelet transform with publicly available implementations 6. The first two are based on the Fast Discrete Curvelet Transform (FDCT) pioneered by Candès, Demanet, Donoho and Ying. They are the "wrapping" and "USFFT" (unequally-spaced Fast Fourier Transform) versions of the FDCT. Both are implemented (2D and 3D for the wrapping version and 2D for the USFFT version) in the proprietary CurveLab Toolbox in MATLAB and C++.

As of 2026, any non-academic use of the CurveLab Toolbox requires a commercial license. Any library which ports or converts Curvelab code to another language is also subject to Curvelab's license. While this does not include libraries which wrap the CurveLab toolbox and therefore do not contain any source code of Curvelab, their usage still requires Curvelab and therefore its license. Such wrappers include curvelops, PyCurvelab, both MIT licensed.

A third flavor is the Uniform Discrete Curvelet Transform (UDCT) which does not have the same restrictive license as the FDCT. The UDCT was first implemented in MATLAB (ucurvmd [dead link]) by one of its authors, Truong Nguyen.

This library provides the first open-source, pure-Python implementation of the UDCT, borrowing heavily from Nguyen's original implementation. The goal of this library is to allow industry professionals to use curvelets more easily. It also goes beyond the original implementation by providing support for complex signals, monogenic extension for real signals [7], and a wavelet transform at the highest scale.

Can I use the Curvelets package for deep learning?

Yes! The package provides a PyTorch module, UDCTModule, which can be used to train deep networks.

Should I use curvelets for deep learning?

This is yet another facet of the "data-centric" vs. "model-centric" debate in machine learning. Exploiting curvelets is a type of model engineering when used as part of the model architecture, or feature engineering when used as a preprocessing step.

It has been shown that fixed filter banks can be useful in speeding up training and improving performance of deep neural networks in some situations [9, 11]. My suggestion is to use curvelets or similar transforms for small to mid-sized datasets, especially in niche areas without a wide variety of high-quality training data.

Another aspect to consider is the availability of high-performance, GPU-accelerated, autodiff-friendly libraries. As far as I know, no curvelet library (apart from this one) satisfies those constraints. Alternative transforms can be found in Kymatio which implements the wavelet scattering transform [10] in PyTorch, TensorFlow and JAX, and Pytorch Wavelets which implements the dual-tree complex wavelet transform [12] in PyTorch.

Project Algorithm Language License N-dimensional? Invertible?
Curvelets UDCT Python MIT Yes Yes
Curvelab FDCT C++ and MATLAB Proprietary (free for academic use only) 2D, 3D Yes
Curvelet.jl UDCT Julia MIT 2D Yes
Kymatio Wavelet scattering transform Python BSD 3-clause 1D, 2D, 3D No
dtcwt Dual-Tree Complex Wavelet Transform Python BSD 2-Clause 1D, 2D, 3D Yes
Pytorch Wavelets Discrete WT and Dual-Tree CWT Python MIT 2D Yes

Credits

The original MATLAB implementation was developed by one of the authors of the UDCT, Truong T. Nguyen. The Python implementation was developed by Carlos Alberto da Costa Filho and Duy Nguyen.

References

[1] Candès, E., L. Demanet, D. Donoho, and L. Ying, 2006, Fast Discrete Curvelet Transforms: Multiscale Modeling & Simulation, 5, 861–899.
[2] Nguyen, T. T., and H. Chauris, 2010, Uniform Discrete Curvelet Transform: IEEE Transactions on Signal Processing, 58, 3618–3634.
[3] Candès, E. J., and L. Demanet, 2005, The curvelet representation of wave propagators is optimally sparse: Communications on Pure and Applied Mathematics, 58, 1472–1528.
[4] Candès, E. J., and D. L. Donoho, 2003, New tight frames of curvelets and optimal representations of objects with piecewise C2 singularities: Communications on Pure and Applied Mathematics, 57, 219–266.
[5] Woiselle, A., J.-L. Starck, and J. Fadili, 2010, 3D curvelet transforms and astronomical data restoration: Applied and Computational Harmonic Analysis, 28, 171–188.
[6] Starck, Jean-Luc. F-CUR3D – CosmoStat: CosmoStat, 26 June 2017, www.cosmostat.org/software/f-cur3d. Accessed 25 Feb. 2026.
[7] Storath, M., 2010, The monogenic curvelet transform: 2010 IEEE International Conference on Image Processing.
[8] Chan, J. Y. H., B. Leistedt, T. D. Kitching, and J. D. McEwen, 2017, Second-Generation Curvelets on the Sphere: IEEE Transactions on Signal Processing, 65, 5–14.
[9] Luan, S., C. Chen, B. Zhang, J. Han, and J. Liu, 2018, Gabor Convolutional Networks: IEEE Transactions on Image Processing, 27, 4357–4366.
[10] Bruna, J., and S. Mallat, 2013, Invariant Scattering Convolution Networks: IEEE Transactions on Pattern Analysis and Machine Intelligence, 35, 1872–1886.
[11] Andreux, M., T. Angles, G. Exarchakis, R. Leonarduzzi, G. Rochette, L. Thiry, J. Zarka, S. Mallat, J. Andén, E. Belilovsky, J. Bruna, V. Lostanlen, M. Chaudhary, M. J. Hirn, E. Oyallon, S. Zhang, C. Cella, and M. Eickenberg, 2020, Kymatio: Scattering Transforms in Python: Journal of Machine Learning Research, 21(60), 1−6.
[12] Kingsbury, N., 2001, Complex Wavelets for Shift Invariant Analysis and Filtering of Signals: Applied and Computational Harmonic Analysis, 10, 234–253.
  1. Supports real inputs with reduced storage requirements which exploit the symmetry of the real-valued Fourier transform. ↩

  2. The directional resolution is asymmetric in the sense that the number of wedges per direction is different for each direction. See the direction resolution example for an example. ↩

  3. Isotropic wavelets are supported. See the curvelet vs wavelet example for an example. ↩

  4. The monogenic curvelet transform was originally defined for 2D signals by Storath 2010, but this implementation extends it to arbitrary N-D signals by using all Riesz transform components (one per dimension). ↩

  5. PyTorch bindings are supported. See the UDCT module gradcheck example for an example. UDCTModule does not support the monogenic mode yet. ↩

  6. The FDCTs and the UDCT are not the only curvelet transforms. To my knowledge, there is another implementation of the 3D Discrete Curvelet Transform named the LR-FCT (Low-Redudancy Fast Curvelet Transform) by Woiselle, Stack and Fadili [5], but the implementation, F-CUR3D, is unavailable. The monogenic curvelet transform [7] does not have a publicly available implementation. The S2LET package implements curvelets on the sphere [8]. ↩

Metadata

Release files for curvelets 1.2

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

Source distribution (sdist)

Source distribution for curvelets 1.2
File Size Uploaded
curvelets-1.2.tar.gz 240.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for curvelets 1.2
File Interpreter ABI Platform
curvelets-1.2-py3-none-any.whl Python 3 none any Details

Total release size: 350.0 kB

Release files / curvelets-1.2.tar.gz

Download URL curvelets-1.2.tar.gz
Size 240.7 kB
Tags Source
SHA-256 checksum
How to use checksums
afebbaa7e21874d274bf35d1390e72643926027a5e51fc89571700503f45e56e
BLAKE2b-256 checksum
How to use checksums
465026a62de2d7e065f82f761cba0f176313bc7ae18348a124ee8b7be46fb6ec
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.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 Jul 20, 2026.

Transparency log

Release files / curvelets-1.2-py3-none-any.whl

Download URL curvelets-1.2-py3-none-any.whl
Size 109.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
829e18d181d0dac79171c18820f4cb7f0dbf3b1d6ea4b198c7e7720b421967f5
BLAKE2b-256 checksum
How to use checksums
fcf0e7ae99864b7270c758e1ad62d0323284c2f04c9ac51d9432d444c4bd27e6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.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 Jul 20, 2026.

Transparency log
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