Source code for dipy.denoise.nlmeans

import numpy as np

from dipy.denoise.denspeed import nlmeans_3d
from dipy.testing.decorators import warning_for_keywords

# from warnings import warn
# import warnings

# warnings.simplefilter('always', DeprecationWarning)
# warn(DeprecationWarning("Module 'dipy.denoise.nlmeans' is deprecated,"
#                         " use module 'dipy.denoise.non_local_means' instead"))


[docs] @warning_for_keywords() def nlmeans( arr, sigma, *, mask=None, patch_radius=1, block_radius=5, rician=True, num_threads=None, ): r"""Non-local means for denoising 3D and 4D images. See :footcite:p:Descoteaux2008a` for further details about the method. Parameters ---------- arr : 3D or 4D ndarray The array to be denoised mask : 3D ndarray sigma : float or 3D array standard deviation of the noise estimated from the data patch_radius : int patch size is ``2 x patch_radius + 1``. Default is 1. block_radius : int block size is ``2 x block_radius + 1``. Default is 5. rician : boolean If True the noise is estimated as Rician, otherwise Gaussian noise is assumed. num_threads : int, optional Number of threads to be used for OpenMP parallelization. If None (default) the value of OMP_NUM_THREADS environment variable is used if it is set, otherwise all available threads are used. If < 0 the maximal number of threads minus $|num_threads + 1|$ is used (enter -1 to use as many threads as possible). 0 raises an error. Returns ------- denoised_arr : ndarray the denoised ``arr`` which has the same shape as ``arr``. References ---------- .. footbibliography:: """ # warn(DeprecationWarning("function 'dipy.denoise.nlmeans'" # " is deprecated, use module " # "'dipy.denoise.non_local_means'" # " instead")) if arr.ndim == 3: sigma = np.ones(arr.shape, dtype=np.float64) * sigma return nlmeans_3d( arr, mask=mask, sigma=sigma, patch_radius=patch_radius, block_radius=block_radius, rician=rician, num_threads=num_threads, ).astype(arr.dtype) elif arr.ndim == 4: denoised_arr = np.zeros_like(arr) if isinstance(sigma, np.ndarray) and sigma.ndim == 3: sigma = np.ones(arr.shape, dtype=np.float64) * sigma[..., np.newaxis] else: sigma = np.ones(arr.shape, dtype=np.float64) * sigma for i in range(arr.shape[-1]): denoised_arr[..., i] = nlmeans_3d( arr[..., i], mask=mask, sigma=sigma[..., i], patch_radius=patch_radius, block_radius=block_radius, rician=rician, num_threads=num_threads, ).astype(arr.dtype) return denoised_arr else: raise ValueError("Only 3D or 4D array are supported!", arr.shape)