WNNM Image Denoising

Python implementation of weighted nuclear norm minimization (WNNM) and comparison against Gaussian, bilateral, and NLM baselines.

GitHub · PDF

This was a course project in computational imaging where I implemented Weighted Nuclear Norm Minimization (WNNM) for grayscale image denoising.

Problem

Given a noisy observation $y = x + \eta$ with additive Gaussian noise, recover a clean estimate without smearing edges and textures. Local filters (Gaussian, bilateral) tend to blur details, while non-local methods try to exploit repeated structure across the image.

Approach

WNNM is a non-local, optimization-based method built around a simple idea: groups of similar patches are approximately low-rank.

For each reference patch:

  1. Search a window around it and find the $n$ most similar patches.
  2. Stack those patches as columns of a matrix $Y$.
  3. Estimate the clean patch matrix $X$ by solving a weighted nuclear norm problem, which reduces to SVD + weighted soft-thresholding of singular values.

What I implemented

A lot of the practical performance comes from details that are easy to skip over in a paper, so I spent time on:

  • Similarity search using MSE and a top-$n$ selection rule (more stable than distance thresholding).
  • Iterative re-estimation of singular value weights (a few inner iterations were enough).
  • A small but helpful trick: centering patch groups before SVD and adding the mean back during reconstruction.
  • Patch aggregation and post-processing (clipping reconstructed intensities to valid ranges made a noticeable difference).
  • Parameter tuning and benchmarking against Gaussian, bilateral, and non-local means (NLM) filters.

Results

On a set of 15 test images corrupted with Gaussian noise ($\sigma = 0.1$), WNNM achieved the best average metrics. PSNR (Peak Signal-to-Noise Ratio) is computed from the mean squared error (MSE) between the denoised image and the ground truth. Higher PSNR means the denoised image is closer to the ground-truth in raw intensity values. SSIM (Structural Similarity) measures perceptual similarity by comparing local luminance/contrast and structural correlation, so higher SSIM means better preservation of edges and textures.

  • WNNM: PSNR 28.40, SSIM 0.86
  • NLM: PSNR 26.97, SSIM 0.82

The baseline Gaussian/bilateral filters were clearly behind on both metrics and visual quality.

Clean image
Clean
PSNR: –
SSIM: –
Noisy image
Noisy
PSNR: 20.30
SSIM: 0.39
Gaussian filtered
Gaussian
PSNR: 28.70
SSIM: 0.83
Bilateral filtered
Bilateral
PSNR: 28.41
SSIM: 0.81
NLM filtered
NLM
PSNR: 29.49
SSIM: 0.88
WNNM filtered
WNNM
PSNR: 31.72
SSIM: 0.93