Using the non-local means filter [Coupe08] and [Coupe11] and you can denoise
3D or 4D images and boost the SNR of your datasets. You can also decide between
modeling the noise as Gaussian or Rician (default). In order to call Calling the main function Let us plot the axial slice of the denoised output Showing axial slice before (left) and after (right) NLMEANS denoising An improved version of non-local means denoising is adaptive soft coefficient
matching, please refer to example_denoise_ascm for more details. P. Coupe, P. Yger, S. Prima, P. Hellier, C. Kervrann, C. Barillot,
“An Optimized Blockwise Non Local Means Denoising Filter for 3D Magnetic
Resonance Images”, IEEE Transactions on Medical Imaging, 27(4):425-441, 2008 Pierrick Coupe, Jose Manjon, Montserrat Robles, Louis Collins.
“Adaptive Multiresolution Non-Local Means Filter for 3D MR Image Denoising”
IET Image Processing, Institution of Engineering and Technology, 2011 Example source code You can download Denoise images using Non-Local Means (NLMEANS)
import numpy as np
import matplotlib.pyplot as plt
from time import time
from dipy.denoise.nlmeans import nlmeans
from dipy.denoise.noise_estimate import estimate_sigma
from dipy.data import get_fnames
from dipy.io.image import load_nifti, save_nifti
t1_fname = get_fnames('stanford_t1')
data, affine = load_nifti(t1_fname)
mask = data > 1500
print("vol size", data.shape)
non_local_means
first you need to estimate the standard
deviation of the noise. We have used N=32 since the Stanford dataset was
acquired on a 3T GE scanner with a 32 array head coil.sigma = estimate_sigma(data, N=32)
non_local_means
t = time()
den = nlmeans(data, sigma=sigma, mask=mask, patch_radius=1,
block_radius=2, rician=True)
print("total time", time() - t)
axial_middle = data.shape[2] // 2
before = data[:, :, axial_middle].T
after = den[:, :, axial_middle].T
difference = np.abs(after.astype(np.float64) - before.astype(np.float64))
difference[~mask[:, :, axial_middle].T] = 0
fig, ax = plt.subplots(1, 3)
ax[0].imshow(before, cmap='gray', origin='lower')
ax[0].set_title('before')
ax[1].imshow(after, cmap='gray', origin='lower')
ax[1].set_title('after')
ax[2].imshow(difference, cmap='gray', origin='lower')
ax[2].set_title('difference')
plt.savefig('denoised.png', bbox_inches='tight')
save_nifti('denoised.nii.gz', den, affine)
References
the full source code of this example
. This same script is also included in the dipy source distribution under the doc/examples/
directory.