I'm at the moment trying to implement a neural network which uses BM3D as a preprocessing step. The problem is, when using the python implementation of BM3D from the paper Collaborative Filtering of Correlated Noise: Exact Transform-Domain Variance for Improved Shrinkage and Patch Matching it requires that a noise power spectrum (PSD) is passed along with the image to be denoised.

# Generate noise with given PSD
noise, psd, kernel = get_experiment_noise(noise_type, noise_var, seed, y.shape)
# N.B.: For the sake of simulating a more realistic acquisition scenario,
# the generated noise is *not* circulant. Therefore there is a slight
# discrepancy between PSD and the actual PSD computed from infinitely many
# realizations of this noise with different seeds.

# Call BM3D With the default settings.
y_est = bm3d(z, psd) 

The original paper for BM3D, Image Denoising by Sparse 3-D Transform-Domain Collaborative Filtering, doesn't say anything about passing this PSD beforehand so my question is: What is the point of passing this PSD? In general, images to be denoised have unknown noise levels, shouldn't the denoising algorithm be self contained, in a sense of doing the estimations by itself?

Am I looking at it wrong?


1 Answer 1


The original paper uses Wiener filtering, which usually requires knowledge of the expected spectrum.

I haven't read the details of the algorithm (included below), but I suspect the PSD input allows the basic estimate to be avoided.

enter image description here

  • 1
    $\begingroup$ I'll have to take a more in depth look at those papers then, as there's so much more work to do then. Thanks a lot! $\endgroup$ Oct 22, 2021 at 22:09

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.