📜  魔杖 wavelet_denoise()函数- Python(1)

📅  最后修改于: 2023-12-03 15:42:33.710000             🧑  作者: Mango

魔杖 wavelet_denoise()函数 - Python

简介

wavelet_denoise()函数是一种用于图像降噪的方法,它基于小波变换,并可用于处理信号和时间序列数据。在Python中,我们可以使用PyWavelets库中的函数进行小波变换。

该函数可以在一定程度上减少图像噪声,同时保留大部分图像细节。它基于小波变换对图像进行分解,并对每个分解系数应用门限函数,以消除由噪声引起的小波系数。

使用方法

安装

在使用wavelet_denoise()函数之前,我们需要先安装PyWavelets库。

!pip install PyWavelets

函数定义

wavelet_denoise()函数的定义如下:

def wavelet_denoise(image, mode='soft', wavelet='db1', level=None, threshold=None, sigma=None):
    """
    使用小波变换进行图像降噪

    Parameters
    ----------
    image : ndarray
        将要被清理的图像数组。
    mode : str {‘hard’, ‘soft’}, 可选
        阈值类型。 'hard'对小于阈值的系数使用零代替,'soft'对小于阈值的系数进行软阈值处理。
    wavelet : pywt.families {‘db’, ‘sym’, ‘coif’, ‘bior’, ‘rbio’, ‘dmey’} family or
              tuple of wavelets, 可选
        小波族。
    level : int, 可选
        分解的等级数。默认为最大等级数。
    threshold: float, 可选
        阈值值。如果不包括,则使用sigma的值,如果引用了这个值但sigma值也给出了,则threshold将被忽略。
    sigma : float, 可选
        阈值值。如果include_threshold为False(默认情况下),则sigma值将与阈值公式中的'sigma'相等(请参见notes)。如果'include_threshold'为True,则'include_threshold'将被使用且'sigma'值将被忽略。

    Returns
    -------
    ndarray
        清理后的图像数组。

    Notes
    -----
    此函数假定输入是灰度图像。 如果您选择的是其他颜色空间,请注意转换图像数组。

    此函数采用以下形式的软或硬阈值函数:

    ``result = threshold (abs (x)) * signum (x)``

    其中threshold是用户指定的阈值值,x是小波系数,它的值可以为小数或感性小数,signum函数返回x的符号。

    对于正硬阈值,阈值值的选定通常是基于随机噪声的估计,估计值可以通过使用如下代码的类型来获得:

    `sigma = np.median (np.abs (coeffs)) / 0.6745`

    参考文献
    ---------------
    Haar-Wavelets and Filterbanks, 1998.  <https://doi.org/10.1002/9780470543934>

    """

使用示例

让我们看一个简单的例子,使用wavelet_denoise()函数处理一张有噪点的图像:

import numpy as np
import matplotlib.pyplot as plt
import scipy.misc

from skimage import data
from skimage import io
from skimage.color import rgb2gray
from skimage.data import camera
from skimage.filters import threshold_otsu

from pywt import wavedec2, waverec2
from pywt import Threshold

def wavelet_denoise(image, mode='soft', wavelet='db1', level=None, threshold=None, sigma=None):
    coeffs = wavedec2(image, wavelet, level=level)
    if threshold is None and sigma is None:
        sigma = np.median(np.abs(coeffs[-level]))
        threshold = sigma * np.sqrt(2*np.log2(image.size))
         
    elif sigma is not None:
        threshold = sigma

    coeffs = [Threshold(rec_coeffs, value=threshold, mode=mode,
                         substitute=0) for rec_coeffs in coeffs]
    return waverec2(coeffs, wavelet)


image = data.camera()
image = image[:256, :256]

plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.show()

denoised_image = wavelet_denoise(image, mode='soft', wavelet='db1', level=2, sigma=None, threshold=None)

plt.imshow(denoised_image, cmap='gray')
plt.title('Denoised Image')
plt.show()

输出结果

运行上面的程序后,我们得到以下结果:

Original Image

Denoised Image

注意事项

使用wavelet_denoise()函数时,需要考虑以下几点:

  • 该算法基于小波变换,因此需要使用pywt.dwt()pywt.idwt()函数对图像进行处理。

  • 选择的小波可以影响算法的性能。在实践中,Daubechies小波族(db)是最常用的。

  • 阈值值的选择通常尤其重要。通常,阈值值基于估计噪声的算法确定,如中值绝对偏差(MAD)和/或基于已知噪声的准确值。在本示例中,我们使用与MAD相似但更稳定的标准差乘以系数数的计算方法,如以下公式所示:sigma = np.median (np.abs (coeffs[-level])) / 0.6745

  • 使用更少的小波分解级别可能会导致过度除噪和图像细节损失。

参考资料