目录
[1.1 什么是图像噪声?](#1.1 什么是图像噪声?)
[1.2 常见噪声类型](#1.2 常见噪声类型)
[1.3 噪声对图像的影响](#1.3 噪声对图像的影响)
[2.1 高斯噪声模拟](#2.1 高斯噪声模拟)
[2.2 椒盐噪声模拟](#2.2 椒盐噪声模拟)
[2.3 泊松噪声模拟](#2.3 泊松噪声模拟)
[3.1 基本原理](#3.1 基本原理)
[3.2 OpenCV实现](#3.2 OpenCV实现)
[3.2.1 基本中值滤波](#3.2.1 基本中值滤波)
[3.2.2 不同核大小对比](#3.2.2 不同核大小对比)
[3.3 自适应中值滤波](#3.3 自适应中值滤波)
[4.1 基本原理](#4.1 基本原理)
[4.2 OpenCV实现](#4.2 OpenCV实现)
[4.2.1 基本双边滤波](#4.2.1 基本双边滤波)
[4.2.2 不同参数对比](#4.2.2 不同参数对比)
[4.3 快速双边滤波](#4.3 快速双边滤波)
[5.1 基本原理](#5.1 基本原理)
[5.2 OpenCV实现](#5.2 OpenCV实现)
[5.2.1 彩色图像非局部均值去噪](#5.2.1 彩色图像非局部均值去噪)
[5.2.2 灰度图像非局部均值去噪](#5.2.2 灰度图像非局部均值去噪)
[5.3 不同参数对比](#5.3 不同参数对比)
[6.1 不同噪声类型的去噪效果](#6.1 不同噪声类型的去噪效果)
[6.2 去噪效果评估](#6.2 去噪效果评估)
[7.1 老照片去噪](#7.1 老照片去噪)
[7.2 医学图像去噪](#7.2 医学图像去噪)
[7.3 夜间图像去噪](#7.3 夜间图像去噪)
[7.4 视频去噪](#7.4 视频去噪)
[8.1 核心要点](#8.1 核心要点)
[8.2 最佳实践](#8.2 最佳实践)
一、图像噪声概述
1.1 什么是图像噪声?
图像噪声是指在图像获取、传输或处理过程中引入的随机干扰信号。噪声会降低图像质量,影响后续的图像处理和分析任务。
1.2 常见噪声类型
按统计特性分类:
高斯噪声:服从高斯分布的随机噪声
椒盐噪声:随机出现的黑白像素点
泊松噪声:与信号强度相关的噪声
均匀噪声:在特定范围内均匀分布的噪声
按产生原因分类:传感器噪声:相机传感器产生的噪声
传输噪声:图像传输过程中引入的噪声
量化噪声:模数转换过程中产生的噪声
环境噪声:光照、温度等环境因素引起的噪声
1.3 噪声对图像的影响
主要影响:
降低图像质量
影响边缘检测
干扰特征提取
降低识别准确率
影响视觉效果
二、噪声模拟
2.1 高斯噪声模拟
python
import cv2
import numpy as np
#读取图像
image = cv2.imread('clean_image.jpg')
#添加高斯噪声
mean: 均值
sigma: 标准差
mean = 0
sigma = 25
#生成高斯噪声
noise = np.random.normal(mean, sigma, image.shape).astype(np.uint8)
#添加噪声到图像
noisy_image = cv2.add(image, noise)
#显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Gaussian Noisy Image', noisy_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.2 椒盐噪声模拟
python
import cv2
import numpy as np
#读取图像
image = cv2.imread('clean_image.jpg')
#添加椒盐噪声
amount: 噪声比例(0-1)
amount = 0.05
#创建噪声掩码
noise_mask = np.random.random(image.shape[:2]) < amount
#添加椒盐噪声
noisy_image = image.copy()
noisy_image[noise_mask] = 0 胡椒噪声(黑色)
noisy_image[noise_mask] = 255 盐噪声(白色)
#显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Salt & Pepper Noisy Image', noisy_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.3 泊松噪声模拟
python
import cv2
import numpy as np
#读取图像
image = cv2.imread('clean_image.jpg')
#转换为浮点型并归一化
image_float = image.astype(np.float32) / 255.0
#添加泊松噪声
#泊松噪声的强度与信号强度相关
noisy_image_float = np.random.poisson(image_float * 255.0) / 255.0
#转换回uint8
noisy_image = (np.clip(noisy_image_float, 0, 1) * 255).astype(np.uint8)
#显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Poisson Noisy Image', noisy_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
三、中值滤波去噪
3.1 基本原理
中值滤波是一种非线性滤波方法,它用邻域内所有像素的中值来替代中心像素的值。中值滤波对椒盐噪声有很好的去除效果。
算法步骤:
将滤波核覆盖的邻域像素排序
选择中间值(中值)作为输出
对所有像素重复此过程
特点:
对椒盐噪声效果极佳
能够较好地保留边缘
计算量较大(需要排序)
对高斯噪声效果一般
3.2 OpenCV实现
3.2.1 基本中值滤波
python
import cv2
import numpy as np
#读取含噪图像
noisy_image = cv2.imread('salt_pepper_noise.jpg')
#中值滤波
ksize: 滤波核大小,必须是正奇数且大于1
ksize = 5
denoised = cv2.medianBlur(noisy_image, ksize)
#显示结果
cv2.imshow('Noisy Image', noisy_image)
cv2.imshow('Median Filtered Image', denoised)
cv2.waitKey(0)
cv2.destroyAllWindows()
3.2.2 不同核大小对比
python
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取含噪图像
noisy_image = cv2.imread('salt_pepper_noise.jpg')
#测试不同的核大小
kernel_sizes = [3, 5, 7, 9]
plt.figure(figsize=(15, 5))
for i, ksize in enumerate(kernel_sizes):
#中值滤波
denoised = cv2.medianBlur(noisy_image, ksize)
plt.subplot(1, len(kernel_sizes), i + 1)
plt.imshow(cv2.cvtColor(denoised, cv2.COLOR_BGR2RGB))
plt.title(f'Kernel Size: {ksize}')
plt.axis('off')
plt.tight_layout()
plt.show()
3.3 自适应中值滤波
python
import cv2
import numpy as np
def adaptive_median_filter(image, max_kernel_size=7):
"""
自适应中值滤波
参数:
image: 输入图像
max_kernel_size: 最大核大小
返回:
去噪后的图像
"""
result = image.copy()
h, w = image.shape[:2]
#转换为灰度图
if len(image.shape) == 3:
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
else:
gray = image.copy()
#对每个像素应用自适应中值滤波
for y in range(h):
for x in range(w):
#从最小核大小开始
kernel_size = 3
while kernel_size <= max_kernel_size:
#计算核的边界
half = kernel_size // 2
y_min = max(0, y half)
y_max = min(h, y + half + 1)
x_min = max(0, x half)
x_max = min(w, x + half + 1)
#提取邻域
neighborhood = gray[y_min:y_max, x_min:x_max]
#计算中值、最小值、最大值
median = np.median(neighborhood)
min_val = np.min(neighborhood)
max_val = np.max(neighborhood)
#判断是否为噪声
if min_val < median < max_val:
#不是噪声,使用中值
result[y, x] = median
break
else:
#可能是噪声,增大核大小
kernel_size += 2
return result
#读取含噪图像
noisy_image = cv2.imread('salt_pepper_noise.jpg')
#自适应中值滤波
denoised = adaptive_median_filter(noisy_image, max_kernel_size=7)
#显示结果
cv2.imshow('Noisy Image', noisy_image)
cv2.imshow('Adaptive Median Filtered Image', denoised)
cv2.waitKey(0)
cv2.destroyAllWindows()
四、双边滤波去噪
4.1 基本原理
双边滤波是一种非线性滤波方法,它同时考虑像素的空间距离和灰度差异,能够在平滑图像的同时很好地保留边缘。
双边滤波的两个高斯函数:
- 空间高斯函数:考虑像素的空间距离
```
Ws(x, y) = exp(-(||x y||²)/(2σs²))
```
- 值域高斯函数:考虑像素的灰度差异
```
Wr(x, y) = exp(-(||I(x) I(y)||²)/(2σr²))
```
双边滤波的权重:
```
W(x, y) = Ws(x, y) * Wr(x, y)
```
特点:
能够在去噪的同时保留边缘
适用于保边去噪
计算量大,速度较慢
参数调节需要经验
4.2 OpenCV实现
4.2.1 基本双边滤波
python
import cv2
import numpy as np
#读取含噪图像
noisy_image = cv2.imread('noisy_image.jpg')
#双边滤波
#d: 滤波过程中每个像素邻域的直径
#sigmaColor: 颜色空间的标准差,值越大表示颜色相近的像素影响越大
#sigmaSpace: 坐标空间的标准差,值越大表示距离较远的像素影响越大
d = 9
sigmaColor = 75
sigmaSpace = 75
denoised = cv2.bilateralFilter(noisy_image, d, sigmaColor, sigmaSpace)
#显示结果
cv2.imshow('Noisy Image', noisy_image)
cv2.imshow('Bilateral Filtered Image', denoised)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.2.2 不同参数对比
python
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取含噪图像
noisy_image = cv2.imread('noisy_image.jpg')
#测试不同的参数
params = [
(5, 50, 50), 轻度去噪
(9, 75, 75), 中度去噪
(15, 100, 100) 重度去噪
]
plt.figure(figsize=(15, 5))
for i, (d, sigmaColor, sigmaSpace) in enumerate(params):
#双边滤波
denoised = cv2.bilateralFilter(noisy_image, d, sigmaColor, sigmaSpace)
plt.subplot(1, len(params), i + 1)
plt.imshow(cv2.cvtColor(denoised, cv2.COLOR_BGR2RGB))
plt.title(f'd={d}, σc={sigmaColor}, σs={sigmaSpace}')
plt.axis('off')
plt.tight_layout()
plt.show()
4.3 快速双边滤波
python
import cv2
import numpy as np
#读取含噪图像
noisy_image = cv2.imread('noisy_image.jpg')
#方法1:标准双边滤波(慢)
start = time.time()
denoised_slow = cv2.bilateralFilter(noisy_image, 9, 75, 75)
time_slow = time.time() start
#方法2:快速双边滤波(使用jointBilateralFilter)
#注意:OpenCV没有直接的jointBilateralFilter函数
#这里使用近似方法
#方法3:使用小核多次双边滤波
start = time.time()
denoised_fast = noisy_image.copy()
for _ in range(3):
denoised_fast = cv2.bilateralFilter(denoised_fast, 5, 50, 50)
time_fast = time.time() start
print(f"标准双边滤波时间: {time_slow:.3f}秒")
print(f"快速双边滤波时间: {time_fast:.3f}秒")
#显示结果
cv2.imshow('Noisy Image', noisy_image)
cv2.imshow('Standard Bilateral Filter', denoised_slow)
cv2.imshow('Fast Bilateral Filter', denoised_fast)
cv2.waitKey(0)
cv2.destroyAllWindows()
五、非局部均值去噪
5.1 基本原理
非局部均值去噪(Non-Local Means Denoising)是一种基于图像自相似性的去噪方法。它利用图像中相似块的统计特性进行去噪。
算法思想:
图像中存在许多相似的块
利用相似块的统计信息进行去噪
保留图像的细节和纹理
特点:
去噪效果好
能够保留细节
计算量大
适合静态图像
5.2 OpenCV实现
5.2.1 彩色图像非局部均值去噪
python
import cv2
import numpy as np
#读取含噪图像
noisy_image = cv2.imread('noisy_image.jpg')
#非局部均值去噪
#h: 滤波强度,值越大去噪效果越强
#hForColorComponents: 颜色通道的滤波强度
#templateWindowSize: 模板窗口大小
#searchWindowSize: 搜索窗口大小
h = 10
hForColorComponents = 10
templateWindowSize = 7
searchWindowSize = 21
denoised = cv2.fastNlMeansDenoisingColored(noisy_image, None, h, hForColorComponents,
templateWindowSize, searchWindowSize)
#显示结果
cv2.imshow('Noisy Image', noisy_image)
cv2.imshow('Non-Local Means Denoised Image', denoised)
cv2.waitKey(0)
cv2.destroyAllWindows()
5.2.2 灰度图像非局部均值去噪
python
import cv2
import numpy as np
#读取含噪图像
noisy_image = cv2.imread('noisy_image.jpg', cv2.IMREAD_GRAYSCALE)
#非局部均值去噪
#h: 滤波强度,值越大去噪效果越强
#templateWindowSize: 模板窗口大小
#searchWindowSize: 搜索窗口大小
h = 10
templateWindowSize = 7
searchWindowSize = 21
denoised = cv2.fastNlMeansDenoising(noisy_image, None, h, templateWindowSize, searchWindowSize)
#显示结果
cv2.imshow('Noisy Image', noisy_image)
cv2.imshow('Non-Local Means Denoised Image', denoised)
cv2.waitKey(0)
cv2.destroyAllWindows()
5.3 不同参数对比
python
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取含噪图像
noisy_image = cv2.imread('noisy_image.jpg')
#测试不同的h值
h_values = [5, 10, 15, 20]
plt.figure(figsize=(15, 5))
for i, h in enumerate(h_values):
#非局部均值去噪
denoised = cv2.fastNlMeansDenoisingColored(noisy_image, None, h, h, 7, 21)
plt.subplot(1, len(h_values), i + 1)
plt.imshow(cv2.cvtColor(denoised, cv2.COLOR_BGR2RGB))
plt.title(f'h = {h}')
plt.axis('off')
plt.tight_layout()
plt.show()
六、去噪方法对比
6.1 不同噪声类型的去噪效果
python
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图像
image = cv2.imread('clean_image.jpg')
#添加高斯噪声
gaussian_noise = np.random.normal(0, 25, image.shape).astype(np.uint8)
gaussian_noisy = cv2.add(image, gaussian_noise)
#添加椒盐噪声
salt_pepper_mask = np.random.random(image.shape[:2]) < 0.05
salt_pepper_noisy = image.copy()
salt_pepper_noisy[salt_pepper_mask] = 0
salt_pepper_noisy[salt_pepper_mask] = 255
#高斯噪声去噪
gaussian_denoised_median = cv2.medianBlur(gaussian_noisy, 5)
gaussian_denoised_bilateral = cv2.bilateralFilter(gaussian_noisy, 9, 75, 75)
gaussian_denoised_nlm = cv2.fastNlMeansDenoisingColored(gaussian_noisy, None, 10, 10, 7, 21)
#椒盐噪声去噪
salt_pepper_denoised_median = cv2.medianBlur(salt_pepper_noisy, 5)
salt_pepper_denoised_bilateral = cv2.bilateralFilter(salt_pepper_noisy, 9, 75, 75)
salt_pepper_denoised_nlm = cv2.fastNlMeansDenoisingColored(salt_pepper_noisy, None, 10, 10, 7, 21)
#显示结果
plt.figure(figsize=(15, 10))
#高斯噪声
plt.subplot(2, 4, 1)
plt.imshow(cv2.cvtColor(gaussian_noisy, cv2.COLOR_BGR2RGB))
plt.title('Gaussian Noisy')
plt.axis('off')
plt.subplot(2, 4, 2)
plt.imshow(cv2.cvtColor(gaussian_denoised_median, cv2.COLOR_BGR2RGB))
plt.title('Median Filter')
plt.axis('off')
plt.subplot(2, 4, 3)
plt.imshow(cv2.cvtColor(gaussian_denoised_bilateral, cv2.COLOR_BGR2RGB))
plt.title('Bilateral Filter')
plt.axis('off')
plt.subplot(2, 4, 4)
plt.imshow(cv2.cvtColor(gaussian_denoised_nlm, cv2.COLOR_BGR2RGB))
plt.title('Non-Local Means')
plt.axis('off')
#椒盐噪声
plt.subplot(2, 4, 5)
plt.imshow(cv2.cvtColor(salt_pepper_noisy, cv2.COLOR_BGR2RGB))
plt.title('Salt & Pepper Noisy')
plt.axis('off')
plt.subplot(2, 4, 6)
plt.imshow(cv2.cvtColor(salt_pepper_denoised_median, cv2.COLOR_BGR2RGB))
plt.title('Median Filter')
plt.axis('off')
plt.subplot(2, 4, 7)
plt.imshow(cv2.cvtColor(salt_pepper_denoised_bilateral, cv2.COLOR_BGR2RGB))
plt.title('Bilateral Filter')
plt.axis('off')
plt.subplot(2, 4, 8)
plt.imshow(cv2.cvtColor(salt_pepper_denoised_nlm, cv2.COLOR_BGR2RGB))
plt.title('Non-Local Means')
plt.axis('off')
plt.tight_layout()
plt.show()
6.2 去噪效果评估
python
import cv2
import numpy as np
#读取图像
image = cv2.imread('clean_image.jpg')
#添加噪声
noise = np.random.normal(0, 25, image.shape).astype(np.uint8)
noisy_image = cv2.add(image, noise)
#去噪
denoised = cv2.fastNlMeansDenoisingColored(noisy_image, None, 10, 10, 7, 21)
#计算PSNR
def calculate_psnr(img1, img2):
mse = np.mean((img1.astype(np.float32) img2.astype(np.float32)) 2)
if mse == 0:
return float('inf')
psnr = 20 * np.log10(255.0 / np.sqrt(mse))
return psnr
#计算SSIM
def calculate_ssim(img1, img2):
C1 = (0.01 * 255) 2
C2 = (0.03 * 255) 2
img1 = img1.astype(np.float64)
img2 = img2.astype(np.float64)
kernel = cv2.getGaussianKernel(11, 1.5)
window = np.outer(kernel, kernel.transpose())
mu1 = cv2.filter2D(img1, -1, window)[5:-5, 5:-5]
mu2 = cv2.filter2D(img2, -1, window)[5:-5, 5:-5]
mu1_sq = mu1 2
mu2_sq = mu2 2
mu1_mu2 = mu1 * mu2
sigma1_sq = cv2.filter2D(img1 2, -1, window)[5:-5, 5:-5] mu1_sq
sigma2_sq = cv2.filter2D(img2 2, -1, window)[5:-5, 5:-5] mu2_sq
sigma12 = cv2.filter2D(img1 * img2, -1, window)[5:-5, 5:-5] mu1_mu2
ssim_map = ((2 * mu1_mu2 + C1) * (2 * sigma12 + C2)) / ((mu1_sq + mu2_sq + C1) * (sigma1_sq + sigma2_sq + C2))
return ssim_map.mean()
#计算评估指标
psnr_noisy = calculate_psnr(image, noisy_image)
psnr_denoised = calculate_psnr(image, denoised)
ssim_noisy = calculate_ssim(image, noisy_image)
ssim_denoised = calculate_ssim(image, denoised)
print(f"含噪图像 PSNR: {psnr_noisy:.2f} dB")
print(f"去噪图像 PSNR: {psnr_denoised:.2f} dB")
print(f"含噪图像 SSIM: {ssim_noisy:.4f}")
print(f"去噪图像 SSIM: {ssim_denoised:.4f}")
七、实战案例
7.1 老照片去噪
python
import cv2
import numpy as np
#读取老照片
old_photo = cv2.imread('old_photo.jpg')
#方法1:中值滤波(去除椒盐噪声)
median_denoised = cv2.medianBlur(old_photo, 5)
#方法2:双边滤波(保边去噪)
bilateral_denoised = cv2.bilateralFilter(old_photo, 9, 75, 75)
#方法3:非局部均值去噪(保留细节)
nlm_denoised = cv2.fastNlMeansDenoisingColored(old_photo, None, 10, 10, 7, 21)
#方法4:组合去噪
combined = cv2.medianBlur(old_photo, 5)
combined = cv2.bilateralFilter(combined, 9, 75, 75)
#显示结果
cv2.imshow('Old Photo', old_photo)
cv2.imshow('Median Filtered', median_denoised)
cv2.imshow('Bilateral Filtered', bilateral_denoised)
cv2.imshow('Non-Local Means', nlm_denoised)
cv2.imshow('Combined', combined)
cv2.waitKey(0)
cv2.destroyAllWindows()
7.2 医学图像去噪
python
import cv2
import numpy as np
#读取医学图像
medical_image = cv2.imread('medical_xray.jpg', cv2.IMREAD_GRAYSCALE)
#方法1:中值滤波
median_denoised = cv2.medianBlur(medical_image, 5)
#方法2:非局部均值去噪
nlm_denoised = cv2.fastNlMeansDenoising(medical_image, None, 10, 7, 21)
#方法3:组合去噪
combined = cv2.medianBlur(medical_image, 5)
combined = cv2.fastNlMeansDenoising(combined, None, 10, 7, 21)
#CLAHE增强
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
enhanced = clahe.apply(combined)
#CLAHE增强2
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
enhanced = clahe.apply(combined)
#显示结果
cv2.imshow('Original Medical Image', medical_image)
cv2.imshow('Median Filtered', median_denoised)
cv2.imshow('Non-Local Means', nlm_denoised)
cv2.imshow('Combined + Enhanced', enhanced)
cv2.waitKey(0)
cv2.destroyAllWindows()
7.3 夜间图像去噪
python
import cv2
import numpy as np
#读取夜间图像
night_image = cv2.imread('night_image.jpg')
#方法1:双边滤波
bilateral_denoised = cv2.bilateralFilter(night_image, 9, 75, 75)
#方法2:非局部均值去噪
nlm_denoised = cv2.fastNlMeansDenoisingColored(night_image, None, 10, 10, 7, 21)
#方法3:组合去噪
combined = cv2.bilateralFilter(night_image, 9, 75, 75)
combined = cv2.fastNlMeansDenoisingColored(combined, None, 10, 10, 7, 21)
#CLAHE增强
lab = cv2.cvtColor(combined, cv2.COLOR_BGR2LAB)
l, a, b = cv2.split(lab)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
l_enhanced = clahe.apply(l)
enhanced_lab = cv2.merge([l_enhanced, a, b])
enhanced = cv2.cvtColor(enhanced_lab, cv2.COLOR_LAB2BGR)
#显示结果
cv2.imshow('Original Night Image', night_image)
cv2.imshow('Bilateral Filtered', bilateral_denoised)
cv2.imshow('Non-Local Means', nlm_denoised)
cv2.imshow('Combined + Enhanced', enhanced)
cv2.waitKey(0)
cv2.destroyAllWindows()
7.4 视频去噪
python
import cv2
import numpy as np
#打开视频文件或摄像头
cap = cv2.VideoCapture('noisy_video.mp4')
#创建视频写入器
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('denoised_video.mp4', fourcc, 30.0,
(int(cap.get(3)), int(cap.get(4))))
while True:
#读取帧
ret, frame = cap.read()
if not ret:
break
#去噪
denoised = cv2.fastNlMeansDenoisingColored(frame, None, 10, 10, 7, 21)
#写入去噪后的帧
out.write(denoised)
#显示结果
cv2.imshow('Original', frame)
cv2.imshow('Denoised', denoised)
if cv2.waitKey(30) & 0xFF == ord('q'):
break
cap.release()
out.release()
cv2.destroyAllWindows()
八、总结
8.1 核心要点
- 噪声类型:识别不同的噪声类型
高斯噪声:使用高斯滤波、非局部均值去噪
椒盐噪声:使用中值滤波
混合噪声:组合多种去噪方法
- 中值滤波:对椒盐噪声效果极佳
去除椒盐噪声
保留边缘
计算量较大
- 双边滤波:保边去噪
去噪同时保留边缘
适用于保边去噪
计算量大
- 非局部均值去噪:保留细节
去噪效果好
保留细节和纹理
计算量大
8.2 最佳实践
噪声识别:首先识别噪声类型
方法选择:根据噪声类型选择合适的去噪方法
椒盐噪声:中值滤波
高斯噪声:高斯滤波、非局部均值去噪
保边去噪:双边滤波
参数调优:根据具体图像调整去噪参数
组合使用:可以组合多种方法达到最佳效果
效果评估:使用PSNR、SSIM等指标评估去噪效果