📅  最后修改于: 2023-12-03 15:42:33.710000             🧑  作者: Mango
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()
运行上面的程序后,我们得到以下结果:
使用wavelet_denoise()
函数时,需要考虑以下几点:
该算法基于小波变换,因此需要使用pywt.dwt()
和pywt.idwt()
函数对图像进行处理。
选择的小波可以影响算法的性能。在实践中,Daubechies小波族(db)是最常用的。
阈值值的选择通常尤其重要。通常,阈值值基于估计噪声的算法确定,如中值绝对偏差(MAD)和/或基于已知噪声的准确值。在本示例中,我们使用与MAD相似但更稳定的标准差乘以系数数的计算方法,如以下公式所示:sigma = np.median (np.abs (coeffs[-level])) / 0.6745
。
使用更少的小波分解级别可能会导致过度除噪和图像细节损失。