Bootstrap

python实现小波阈值去噪

纲要:本文采用小波阈值方法来对预先加了标准差为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")

结果对比:

原图像:
在这里插入图片描述

结果图像:
在这里插入图片描述

总结:这里能够看到小波去噪对去除高斯噪声的效果还是可以的,但是效果不是很明显。大家可以从阈值的选择以及调整滤波的阈值,甚至将各层的阈值设置为不同的值再去试试。再看看有关的论文关于提升小波阈值效果的实现方法。本文只是举个简单的例子来说明小波阈值的处理过程

参考文献https://blog.csdn.net/weixin_45317919/article/details/109295551?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161581876116780262554560%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=161581876116780262554560&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-1-109295551.pc_search_result_cache&utm_term=%E5%B0%8F%E6%B3%A2%E9%98%88%E5%80%BC%E5%8E%BB%E5%99%AA

;