OpenCV去噪算法实战:中值滤波与双边滤波应用

目录

一、图像噪声概述

[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 基本原理

中值滤波是一种非线性滤波方法,它用邻域内所有像素的中值来替代中心像素的值。中值滤波对椒盐噪声有很好的去除效果。

算法步骤:

  1. 将滤波核覆盖的邻域像素排序

  2. 选择中间值(中值)作为输出

  3. 对所有像素重复此过程

特点:

对椒盐噪声效果极佳

能够较好地保留边缘

计算量较大(需要排序)

对高斯噪声效果一般

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 基本原理

双边滤波是一种非线性滤波方法,它同时考虑像素的空间距离和灰度差异,能够在平滑图像的同时很好地保留边缘。

双边滤波的两个高斯函数:

  1. 空间高斯函数:考虑像素的空间距离

```

Ws(x, y) = exp(-(||x y||²)/(2σs²))

```

  1. 值域高斯函数:考虑像素的灰度差异

```

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 核心要点

  1. 噪声类型:识别不同的噪声类型

高斯噪声:使用高斯滤波、非局部均值去噪

椒盐噪声:使用中值滤波

混合噪声:组合多种去噪方法

  1. 中值滤波:对椒盐噪声效果极佳

去除椒盐噪声

保留边缘

计算量较大

  1. 双边滤波:保边去噪

去噪同时保留边缘

适用于保边去噪

计算量大

  1. 非局部均值去噪:保留细节

去噪效果好

保留细节和纹理

计算量大

8.2 最佳实践

  1. 噪声识别:首先识别噪声类型

  2. 方法选择:根据噪声类型选择合适的去噪方法

椒盐噪声:中值滤波

高斯噪声:高斯滤波、非局部均值去噪

保边去噪:双边滤波

  1. 参数调优:根据具体图像调整去噪参数

  2. 组合使用:可以组合多种方法达到最佳效果

  3. 效果评估:使用PSNR、SSIM等指标评估去噪效果

相关推荐
zhangshuang-peta1 小时前
MCP 如何重新定义 Skill:从“能力函数”变成“可治理行为”
人工智能·ai·ai agent·mcp·peta
yubo05091 小时前
计算机视觉第六课:打开摄像头,实时框出物体
人工智能·opencv·计算机视觉
FL16238631292 小时前
窗户干净脏污分类窗户清洁状态分类数据集3299张2类别已划分训练验证测试集
人工智能·分类·数据挖掘
阿里云大数据AI技术2 小时前
基于阿里云 DataWorks Data Agent 进行大模型热度分析
人工智能·agent·nvidia
碳基硅坊2 小时前
Qwen3.5-9B在安全生产安全帽检测中的应用
人工智能·安全·安全帽检测·qwen3.5-9b
云烟成雨TD2 小时前
Spring AI Alibaba 1.x 系列【66】Graph 长期记忆
java·人工智能·spring
春日见2 小时前
五分钟入门 强化学习---Q-Learning算法与实现
人工智能·python·深度学习·算法·机器学习·计算机视觉
卡次卡次12 小时前
vibecoding起步之Claude Code的skills是什么,里面有什么文件,以ppt的一个skills举例
人工智能·opencv·powerpoint
AI服务老曹2 小时前
解耦异构算力:基于 Docker 与 GB28181/RTSP 的边缘计算 AI 视频管理平台架构设计与源码交付实践
人工智能·docker·边缘计算