纲要:本文采用小波阈值方法来对预先加了标准差为15的高斯噪声的lena(256x256)图像进行小波阈值去噪,其中各层的滤波阈值均为同一值,采用的小波基为sym4小波,分解层数为3,阈值函数为软阈值函数。
原理:小波阈值去噪的实质为抑制信号中无用部分、增强有用部分的过程。小波阈值去噪过程为:(1)分解过程,即选定一种小波对信号进行n层小波分解;(2)阈值处理过程,即对分解的各层系数进行阈值处理,获得估计小波系数;(3)重构过程,据去噪后的小波系数进行小波重构,获得去噪后的信号。
影响效果的因素:分解层数、阈值、小波基的选择、阈值函数的选择
代码:
import pywt
import numpy as np
from cv2 import cv2
from PIL import Image
#==============固定阈值、预设小波=====================
img = cv2.imread("lenags15.bmp", 0)
w = 'sym4' # 定义小波基的类型
l = 3 # 变换层次为3
coeffs = pywt.wavedec2(data=img, wavelet=w, level=l) # 对图像进行小波分解
threshold = 0.04
list_coeffs = []
for i in range(1, len(coeffs)):
list_coeffs_ = list(coeffs[i])
list_coeffs.append(list_coeffs_)
for r1 in range(len(list_coeffs)):
for r2 in range(len(list_coeffs[r1])):
# 对噪声滤波(软阈值)
list_coeffs[r1][r2] = pywt.threshold(list_coeffs[r1][r2], threshold*np.max(list_coeffs[r1][r2]))
rec_coeffs = [] # 重构系数
rec_coeffs.append(coeffs[0]) # 将原图像的低尺度系数保留进来
for j in range(len(list_coeffs)):
rec_coeffs_ = tuple(list_coeffs[j])
rec_coeffs.append(rec_coeffs_)
denoised_img = pywt.waverec2(rec_coeffs, 'sym4')
denoised_img = Image.fromarray(np.uint8(denoised_img))
denoised_img.save("result.bmp")
结果对比:
原图像:
结果图像:
总结:这里能够看到小波去噪对去除高斯噪声的效果还是可以的,但是效果不是很明显。大家可以从阈值的选择以及调整滤波的阈值,甚至将各层的阈值设置为不同的值再去试试。再看看有关的论文关于提升小波阈值效果的实现方法。本文只是举个简单的例子来说明小波阈值的处理过程