Skip to content

cako/curvelets

Repository files navigation

Curvelets

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

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.

Related Projects

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.

Footnotes

  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].

About

Uniform Discrete Curvelet Transform in Python

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Packages

No packages published

Contributors 3

  •  
  •  
  •