Returns: - denoised: maximally denoised image """ # Ensure float in [0,1] range if image.max() > 1.0: image = image.astype(np.float32) / 255.0 else: image = image.astype(np.float32)

if denoised.ndim == 2: coeffs = list(coeffs) coeffs[1:] = threshold_coeffs(coeffs[1:], threshold) denoised = pywt.waverec2(coeffs, wavelet) else: coeffs = list(coeffs) coeffs[1:] = threshold_coeffs(coeffs[1:], threshold) denoised = pywt.waverec(coeffs, wavelet)

# 4. Median filter (removes any remaining salt-and-pepper noise) denoised = cv2.medianBlur((denoised * 255).astype(np.uint8), 3).astype(np.float32) / 255.0

# 1. Strong Non-Local Means (preserves edges while smoothing flat regions) denoised = denoise_nl_means(image, h=h, sigma=sigma, fast_mode=True, patch_size=7, patch_distance=11, multichannel=(image.ndim==3))

# 2. Wavelet hard thresholding (removes residual high-frequency noise) coeffs = pywt.wavedec2(denoised, wavelet, level=4) if denoised.ndim == 2 else \ pywt.wavedec(denoised, wavelet, level=4)

error: