ComfyUI Extension: ComfyUI_CompressedSensingAugmentation
Run ComfyUI workflows without the setup
No installs, no CUDA version roulette, no GPU sitting idle on your bill. Bring a workflow and run it in the browser.
A custom ComfyUI node that reconstructs an image from only 10% randomly sampled k-space (Fourier) coefficients using rigorous Compressed Sensing theory.
Looking for a different extension?
Custom Nodes (0)
README
ComfyUI Compressed Sensing Node
A custom ComfyUI node that reconstructs an image from only 10% randomly sampled k-space (Fourier) coefficients using rigorous Compressed Sensing theory.

Algorithm
1. Measurement — k-space subsampling
The image is transformed into the 2-D Fourier (k-space) domain, and only 10% of the complex coefficients are retained:
y = Ω ⊙ Fx
| Symbol | Meaning |
|--------|---------|
| x | Original image |
| F | 2-D orthonormal DFT (numpy.fft.fft2, norm='ortho') |
| Ω | Binary k-space sampling mask (10% ones) |
| y | Observed k-space measurements |
Using the Fourier domain satisfies the incoherence condition central to CS theory: the DFT basis is maximally incoherent with the canonical (pixel) basis, and natural images have sparse gradients (TV sparsity), giving theoretical recovery guarantees.
2. Reconstruction — ISTA with TV regularisation
The image is recovered by solving the convex optimisation problem:
min_x ½‖Ω ⊙ (Fx − y)‖² + λ·TV(x)
Solved iteratively via ISTA (Iterative Shrinkage-Thresholding Algorithm):
∇f(x) = F^H [ Ω ⊙ (Fx − y) ] ← gradient of data-fidelity
= IFFT2( Ω ⊙ (FFT2(x) − y) ).real
x ← prox_{λ·TV}( x − ∇f(x) ) ← TV proximal step (Chambolle)
The step size is exactly 1 because F is unitary (F^H F = I) and Ω is a binary mask, so the Lipschitz constant of the forward operator is L = 1.
Why k-space, not pixel-domain?
| Property | Pixel-domain sampling | k-space sampling (this node) | |----------|----------------------|----------------------------------| | Measurement domain | Pixel space | Fourier space | | Sparsity domain | Gradient (TV) | Gradient (TV) | | Incoherence | Weak (same domain) | Strong (maximally incoherent) | | CS theory guarantee | Limited | Satisfies RIP w.h.p. | | Real-world analogue | — | MRI, radar |
Sampling Patterns
variable_density (default, MRI-style)
Samples more densely near DC (low frequencies) using a 2-D Gaussian density. DC is always included. Gives better perceptual quality because most image energy is at low frequencies.
uniform
Uniformly random k-space subsampling. Theoretically cleaner (i.i.d. draws), useful for benchmarking.
Installation
# 1. Copy this folder into ComfyUI's custom_nodes directory
cp -r ComfyUI_CompressedSensing /path/to/ComfyUI/custom_nodes/
# 2. Install dependencies
pip install scikit-image
# 3. Restart ComfyUI
numpyandtorchare already bundled with ComfyUI.scikit-imageis strongly recommended for faster TV denoising. A pure-NumPy Chambolle fallback is included if it is unavailable.
Node Reference
Category: CompressedSensing
Node name: Compressed Sensing (10% Random Sampling)
Inputs
| Name | Type | Default | Description |
|------|------|---------|-------------|
| image | IMAGE | — | Input image |
| sampling_ratio | FLOAT | 0.10 | Fraction of k-space to observe (0.01 – 1.00) |
| sampling_pattern | ENUM | variable_density | variable_density or uniform |
| iterations | INT | 300 | ISTA iteration count. More = better quality, slower |
| tv_weight | FLOAT | 0.05 | TV regularisation strength λ. Lower = sharper; higher = smoother |
| seed | INT | 0 | Random seed. 0 = different mask every run |
Outputs
| Name | Type | Description |
|------|------|-------------|
| reconstructed | IMAGE | CS-reconstructed image |
| kspace_mask | IMAGE | k-space sampling pattern (DC at centre, white = sampled) |
Parameter Tuning Guide
| Goal | Suggestion |
|------|-----------|
| Better quality | Increase iterations (500 – 1000) |
| Sharper edges | Decrease tv_weight (0.01 – 0.03) |
| Smoother result | Increase tv_weight (0.1 – 0.3) |
| Reproducible mask | Set seed to any fixed non-zero integer |
| More measurements | Increase sampling_ratio (0.20 – 0.30) |
Example Workflow
Load Image → CompressedSensing → Preview Image (reconstructed)
→ Preview Image (kspace_mask)
Requirements
- Python 3.8+
- numpy
- torch (provided by ComfyUI)
- scikit-image ≥ 0.19 (recommended)
Theoretical Background
Compressed Sensing (Candès, Romberg & Tao 2006; Donoho 2006) states that a signal with a sparse representation in basis Ψ can be exactly recovered from m = O(s log n) incoherent measurements — far fewer than the n samples Nyquist requires — where s is the sparsity level.
This node's setup:
| CS ingredient | Choice |
|---------------|--------|
| Signal | Natural image x ∈ ℝⁿ |
| Sparsifying basis Ψ | Gradient domain (TV) |
| Measurement matrix Φ | Subsampled 2-D DFT |
| Incoherence μ(Φ, Ψ) | Near-minimal (Fourier ↔ pixel) |
| Recovery algorithm | ISTA (convex, globally convergent) |
Lustig, Donoho & Pauly (2007) "Sparse MRI" is the seminal paper applying exactly this approach to accelerate MRI acquisition.
License
MIT
Run ComfyUI workflows without the setup
No installs, no CUDA version roulette, no GPU sitting idle on your bill. Bring a workflow and run it in the browser.