当前位置: 首页 > news >正文

(一)OpenCV——噪声去除(降噪)

高斯滤波器(针对高斯噪声)

高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。常见的高斯噪声包括起伏噪声、宇宙噪声、热噪声和散粒噪声等等。

高斯滤波(Gaussian filter) 包含许多种,包括低通、带通和高通等,我们通常图像上说的高斯滤波,指的是 高斯模糊(Gaussian Blur) ,是一种 高斯低通滤波 ,其过滤调图像高频成分(图像细节部分),保留图像低频成分(图像平滑区域),所以对图像进行 ‘高斯模糊’ 后,图像会变得模糊。

高斯模糊对于抑制 高斯噪声 (服从正态分布的噪声) 非常有效。

高斯滤波是一种常用的图像去噪方法,它通过在图像上进行卷积操作来实现。

高斯滤波的计算过程:

高斯函数

在计算每个像素时,都把当前中心点看作坐标原点,可以使得均值 μ = 0 ,简化高斯函数的公式:

其中:

  • (x,y) 是核中某点相对于中心点的坐标

  • σ 是标准差(控制平滑程度)

高斯核的生成

高斯滤波的重要两步就是先找到高斯核然后再进行卷积

生成示例(3×3高斯核,σ=1)

import numpy as npdef gaussian_kernel(size, sigma=1):kernel = np.fromfunction(lambda x, y: (1/(2*np.pi*sigma**2)) * np.exp(-((x-(size-1)/2)**2 + (y-(size-1)/2)**2)/(2*sigma**2)),(size, size))return kernel / np.sum(kernel)  # 归一化kernel = gaussian_kernel(3)
print(kernel)

输出结果:

[[0.07511361 0.1238414  0.07511361][0.1238414  0.20417996 0.1238414 ][0.07511361 0.1238414  0.07511361]]

卷积计算

高斯滤波的卷积计算步骤如下:

  1. 核中心对准:将高斯核中心对准图像的每个像素

  2. 对应相乘:核覆盖区域的像素值与核权重逐点相乘

  3. 求和:将所有乘积结果相加

  4. 替换中心像素:用求和结果替换原中心像素值


计算示例(3×3区域):

图像局部区域I:
[100 120 110]
[ 90 100 115]
[ 95 105 108]高斯核:
[[0.07511361 0.1238414  0.07511361][0.1238414  0.20417996 0.1238414 ][0.07511361 0.1238414  0.07511361]]计算后的结果:
[0.075 0.124 0.075]
[0.124 0.204 0.124]
[0.075 0.124 0.075]计算过程:
新中心值 = 100*0.075 + 120*0.124 + 110*0.075 +90*0.124 + 100*0.204 + 115*0.124 +95*0.075 + 105*0.124 + 108*0.075≈ 103.3

给原图加上高斯噪声,并绘制加噪后的像素值分布图

经过高斯滤波处理后的图像

 

归一化

归一化(Normalization)在图像滤波和卷积运算中是一个关键步骤,它确保滤波操作不会改变图像的整体亮度水平。

归一化的基本定义

归一化指的是将滤波器(卷积核)的所有权重值进行缩放,使得它们的总和等于1。数学表达式为:

归一化核 = 原始核 / ∑(原始核所有元素)

为什么需要归一化? 

保持图像亮度恒定

未经归一化:卷积后图像整体会变亮或变暗

kernel = np.array([[1, 1, 1],[1, 1, 1],[1, 1, 1]])  # 总和=9
# 应用该核会使每个像素值变为原来的9倍

归一化后: 

normalized_kernel = kernel / 9  # 总和=1

不需要归一化的特殊情况 

某些滤波器故意不归一化

  • 边缘检测算子(如Sobel、Laplacian)
sobel_x = np.array([[-1, 0, 1],[-2, 0, 2],[-1, 0, 1]])  # 总和=0
  • 锐化滤波器

  • 这些滤波器需要保留灰度变化信息

中值滤波器(针对椒盐噪声)

中值滤波(Median Filter)是一种非线性滤波方法,主要用于去除图像中的椒盐噪声(Salt-and-Pepper Noise)同时较好地保留图像边缘。它的计算过程与线性滤波器(如高斯滤波)完全不同。

基本计算步骤

对于一个像素点,中值滤波的计算过程如下:

  1. 定义滤波窗口:选择一个奇数尺寸的邻域窗口(如3×3、5×5等)

  2. 提取窗口内像素值:取出该窗口覆盖的所有像素值

  3. 排序像素值:将这些像素值按从小到大(或从大到小)排序

  4. 取中值:选择排序后的中间值作为该像素点的新值

  5. 替换原像素:用这个中值替换原图像中对应位置的像素值

具体计算示例

假设我们有一个3×3的图像区域和3×3的中值滤波窗口:

原始图像区域(3×3):

[120, 125, 130,115, 255, 120,  ← 中心像素255可能是噪声(椒盐噪声)110, 105, 140]

计算过程:

  1. 提取所有9个像素值:[120, 125, 130, 115, 255, 120, 110, 105, 140]

  2. 排序:[105, 110, 115, 120, 120, 125, 130, 140, 255]

  3. 取中值(第5个值):120

  4. 用120替换原中心像素255

中值滤波的特点

  1. 非线性处理:不能表示为核卷积

  2. 去噪效果:特别适合去除椒盐噪声

  3. 边缘保留:比均值滤波更好地保留边缘

  4. 计算复杂度:比线性滤波高,因为涉及排序操作

  5. 窗口大小:通常使用奇数尺寸(3×3, 5×5等)

给图像加入椒盐噪声,并去噪

 均值滤波器(简单平滑)

均值滤波器(Mean Filter),也称为简单平滑滤波器箱式滤波器(Box Filter),是最基础的线性滤波器之一。

基本原理

均值滤波通过用邻域像素的平均值代替中心像素值来实现图像平滑:

  • 线性操作:可以表示为卷积运算

  • 均匀权重:滤波窗口内所有像素权重相同

  • 平滑效果:减少图像噪声和细节

计算过程

对于一个N×N的均值滤波器:

  1. 定义滤波窗口:选择滤波器尺寸(如3×3、5×5等)

  2. 遍历图像:对每个像素应用滤波窗口

  3. 计算平均值:计算窗口内所有像素的算术平均值

  4. 替换中心像素:用平均值替换原中心像素值、

数学表达式:

新像素值 = (1/N²) × Σ(窗口内所有像素值)

具体示例

考虑一个3×3的图像区域:

[50, 60, 70]
[40, 255, 80]  ← 中心像素255可能是噪声
[30, 20, 90]

计算过程:

  1. 提取所有9个像素值:[50, 60, 70, 40, 255, 80, 30, 20, 90]

  2. 计算平均值:(50+60+70+40+255+80+30+20+90)/9 = 85

  3. 用85替换原中心像素255

应用场景

  1. 快速平滑:需要简单快速平滑处理时

  2. 预处理:作为更复杂处理的预处理步骤

  3. 均匀区域处理:处理纹理较均匀的图像区域

高斯滤波、均值滤波与中值滤波的全面对比

基本性质对比

特性高斯滤波均值滤波中值滤波
滤波器类型线性滤波器线性滤波器非线性滤波器
计算复杂度中等(可分离优化)高(需要排序)
权重分配中心权重高,边缘权重低均匀权重无权重概念
归一化要求需要需要不需要

去噪效果对比

噪声类型高斯滤波表现均值滤波表现中值滤波表现
高斯噪声效果最好效果较好效果一般
椒盐噪声效果较差效果差效果最好
脉冲噪声效果差效果差效果极佳

边缘保持能力

边缘特性高斯滤波均值滤波中值滤波
边缘模糊程度中等(σ越大越模糊)严重最小
锐利边缘保持较好优秀
细节保留中等

实际应用对比

高斯滤波最佳场景

  • 需要平滑但保留一定边缘

  • 预处理步骤(如Canny边缘检测前)

  • 光学系统产生的自然模糊建模

均值滤波适用场景

  • 快速简单平滑需求

  • 计算资源有限的场景

  • 均匀区域的噪声去除

中值滤波不可替代场景

  • 椒盐噪声去除(旧照片修复)

  • 需要保留锐利边缘(医学影像)

  • 脉冲噪声环境(工业检测)

参考文章:

https://blog.csdn.net/a435262767/article/details/107115249

http://www.dtcms.com/a/273265.html

相关文章:

  • React--Fiber 架构
  • 数据库操作核心知识点整理
  • mac m1芯片 安装pd及win10系统
  • 第12讲—一元函数积分学的物理应用
  • 在vscode中安装jupyter
  • 电机电角度与机械角度的个人理解:从蒙圈到理解到放弃
  • 蓝桥云课 矩形切割-Java
  • 快速分页wpf
  • npx cowsay 让动物说话~
  • Java重试+事务的方式优化saveBatch,配置信息修改
  • Flink Exactly Once 和 幂等
  • 【郑大二年级信安小学期】Day9:XSS跨站攻击XSS绕过CSRF漏洞SSRF漏洞
  • 服务器深夜告警?可能是攻击前兆!
  • Unity插件——ABC详解
  • AI驱动的低代码革命:解构与重塑开发范式
  • LeetCode 8. 字符串转换整数 (atoi)
  • 【保姆级喂饭教程】idea中安装Conventional Commit插件
  • FreeRTOS—任务创建和删除的API函数和方法
  • 书生实训营第二关:大模型对战
  • 列表初始化
  • C++ Lambda 表达式详解
  • 《棒垒球知道》奥运会的吉祥物是什么·棒球1号位
  • 【c++八股文】Day6:using和typedef
  • [yolo-world]YOLO-World数据集介绍及标注格式详解
  • SoC程序如何使用单例模式运行
  • 什么是 MIT License?核心要点解析
  • [数据结构与算法] 优先队列 | 最小堆 C++
  • 几种LLM推理加速技术的区别
  • 列表页与详情页的智能识别:多维度判定方法与工业级实现
  • 海光芯赋能:国产化高性能计算平台,重塑边缘与工业智能新算力