This article presents a detailed implementation of the Non-Local Bayes (NL-Bayes) image denoising algorithm. In a nutshell, NL-Bayes is an improved variant of NL-means. In the NL-means algorithm, each patch is replaced by a weighted mean of the most similar patches present in a neighborhood. Images being mostly self-similar, such instances of similar patches are generally found, and averaging them increases the SNR. The NL-Bayes strategy improves on NL-means by evaluating for each group of similar patches a Gaussian vector model. To each patch is therefore associated a mean (which would be the result of NL-means), but also a covariance matrix estimating the variability of the patch group. This permits to compute an optimal (in the sense of Bayesian minimal mean square error) estimate of each noisy patch in the group, by a simple matrix inversion.
The implementation proceeds in two identical iterations, but the second iteration uses the denoised image of the first iteration to estimate better the mean and covariance of the patch Gaussian models. A discussion of the algorithm shows that it is close in spirit to several state of the art algorithms (TSID, BM3D, BM3D-SAPCA), and that its structure is actually close to BM3D. Thorough experimental comparison made in this paper also shows that the algorithm achieves the best state of the art on color images in terms of PSNR and image quality. On grey level images, it reaches a performance similar to the more complex BM3D-SAPCA (no color version is available for this last algorithm).