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

opencv-python图像增强一:传统图像去噪方法整理

一、简介:

在数字图像处理领域,噪声一直是影响图像质量的重要因素。无论是拍摄过程中的环境干扰,还是传输过程中的信号失真,噪声都可能导致图像模糊、细节丢失,甚至影响后续的图像分析和应用。为了提高图像的视觉效果和使用价值,图像去噪技术应运而生,成为图像预处理环节中不可或缺的一环。在本文中介绍几个常用的传统图像去噪的方法以及其应用情景。

文章目录

  • 一、简介:
  • 二:常用的去噪方法梳理:
  • 三:简述与实现方法:
    • 3.1均值滤波
    • 3.2中值滤波
    • 3.3高斯滤波
    • 3.4双边滤波
    • 3.5非局部均值去噪
    • 3.6引导滤波去噪
    • 3.7小波变换去噪

二:常用的去噪方法梳理:

在传统图像处理领域,去噪技术是提高图像质量的重要手段。以下是一些常见的去噪技术:

  1. 均值滤波去噪:该方法通过对图像中的每个像素点及其邻域内的像素点取平均值,来替代原始像素值,从而实现去噪。均值滤波简单易实现,但容易导致图像边缘模糊。
  2. 中值滤波去噪:中值滤波将图像中每个像素点与其邻域内的像素点进行排序,取中值作为滤波结果。这种方法在去除噪声的同时,能较好地保护图像的边缘信息。
  3. 高斯滤波去噪:高斯滤波是一种加权平均滤波,权重是根据高斯函数计算得出的。它能够有效地去除图像中的高斯噪声,同时保留图像的细节。
  4. 双边滤波去噪:双边滤波结合了空间邻近度和像素值相似度,是一种保边缘的滤波方法。它既能去除噪声,又能保持图像的边缘信息。
  5. 非局部均值去噪:非局部均值去噪考虑了图像中重复的纹理信息,通过搜索整个图像来寻找相似块,并进行加权平均。这种方法在去除噪声的同时,能更好地保持图像的细节和结构。
  6. 引导滤波去噪:引导滤波利用引导图像与待滤波图像之间的关系,对图像进行局部线性滤波。这种方法在去噪的同时,能有效保护图像的边缘和细节。
  7. 小波变换去噪:小波变换将图像分解为不同尺度和方向的小波系数,通过对这些系数进行阈值处理,达到去噪的目的。小波变换去噪在去除噪声的同时,能较好地保留图像的纹理和细节。

三:简述与实现方法:

3.1均值滤波

均值滤波是一种简单的图像去噪方法,属于线性滤波器的一种。它的基本思想是用目标像素周围邻域内的像素的平均值来代替目标像素的值,从而消除图像中的随机噪声。
均值滤波常用于图像预处理阶段,特别是在需要快速去噪且对图像细节要求不高的场合或者用于模糊图像细节只保留颜色等图像低频信息。

代码如下:

import cv2
# 读取图像
image = cv2.imread('noisy_image.jpg', cv2.IMREAD_GRAYSCALE)
# 应用3x3的均值滤波
blurred_image = cv2.blur(image, (3, 3))
# 显示原图和均值滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Blurred Image', blurred_image)
# 等待按键后退出
cv2.waitKey(0)
cv2.destroyAllWindows()

3.2中值滤波

中值滤波是一种非线性的数字滤波技术,主要用于去除图像中的椒盐噪声(由离散的黑白像素组成)和其他类型的脉冲噪声。中值滤波器的核心思想是使用像素邻域中的像素值的中值来代替目标像素的值。
中值滤波一般都用在黑白蒙版上用来去除二值化后所带来的椒盐噪声,以此来获取干净的蒙版。

代码如下:

import cv2# 读取图像
image = cv2.imread('noisy_image.jpg', cv2.IMREAD_GRAYSCALE)
# 应用3x3的中值滤波
median_filtered_image = cv2.medianBlur(image, 3)
# 显示原图和均值滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Median Filtered Image', median_filtered_image)
# 等待按键后退出
cv2.waitKey(0)
cv2.destroyAllWindows()

3.3高斯滤波

高斯滤波是一种基于高斯函数的线性平滑滤波器,用于去除图像中的噪声,同时保留图像的边缘和细节。它通过对图像中每个像素的值进行加权平均来实现去噪,其中权重由高斯函数确定。使用高斯滤波参数的时候通常,可以从较小的标准差和核大小开始,逐渐增加,直到找到一个平衡点,既能有效去除噪声,又能保留图像的细节。

代码如下:


import cv2
# 读取图像
image = cv2.imread('noisy_image.jpg', cv2.IMREAD_GRAYSCALE)
# 应用高斯滤波,这里使用3x3的窗口和标准差为2的高斯核
gaussian_filtered_image = cv2.GaussianBlur(image, (3, 3), 2)
# 显示原图和高斯滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Gaussian Filtered Image', gaussian_filtered_image)
# 等待按键后退出
cv2.waitKey(0)
cv2.destroyAllWindows()

3.4双边滤波

双边滤波是一种非线性的滤波技术,用于去除图像中的噪声,同时尽可能保留边缘细节。与高斯滤波器不同,双边滤波器考虑了像素之间的空间邻近性和像素值相似性,从而在去除噪声的同时更好地保留边缘。双边滤波器能够很好地保留图像的边缘和细节,因为它不仅考虑像素的空间邻近性,还考虑像素值的相似性。但相应的双边滤波器的计算复杂度较高,推理时间相对较慢。

代码如下:

import cv2# 读取图像
image = cv2.imread('noisy_image.jpg', cv2.IMREAD_GRAYSCALE)
# 应用双边滤波,这里使用3x3的窗口
bilateral_filtered_image = cv2.bilateralFilter(image, 9, 25, 25)
# 显示原图和双边滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Bilateral Filtered Image', bilateral_filtered_image)
# 等待按键后退出
cv2.waitKey(0)
cv2.destroyAllWindows()

双边滤波有三个参数

  1. diameter: 邻域大小,以像素为单位。这个参数决定了滤波器的邻域大小。较大的直径可以覆盖更多的像素,从而更好地平滑噪声,但可能会模糊边缘。较小的直径则可以更好地保留边缘细节,但去噪效果可能不够理想。
  2. sigmaColor: 颜色空间相似性的权重。较大的值会更多地平滑颜色差异较大的像素,而较小的值会更多地保留颜色差异较大的像素。这个参数控制了颜色空间内的相似性权重。
  3. sigmaSpace: 空间邻近性的权重。较大的值会更多地平滑空间上相邻的像素,而较小的值会更多地保留空间上相邻的像素。这个参数控制了空间邻近性权重。的权重值可以更好地保留边缘,但去噪效果可能不够理想。

3.5非局部均值去噪

非局部均值去噪(Non-Local Means Denoising)是一种基于图像内容相似性的去噪方法,它通过搜索图像中的相似块,并计算这些相似块的平均值来估计目标像素的值,从而实现去噪。这种方法特别适用于去除高斯噪声和其他类型的随机噪声

代码如下:

import cv2
# 读取图像
image = cv2.imread('noisy_image.jpg', cv2.IMREAD_GRAYSCALE)
# 应用非局部均值去噪
non_local_filtered_image = cv2.fastNlMeansDenoising(image, None, 1010, 10, 7)
# 显示原图和非局部均值去噪后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Non-Local Means Filtered Image', non_local_filtered_image)
# 等待按键后退出
cv2.waitKey(0)
cv2.destroyAllWindows()

其参数为:

  1. image: 输入图像,可以是灰度图像或彩色图像。
  2. dst: 输出图像,用于存储去噪后的结果。如果不指定,则由函数自动分配。
  3. h: 噪声估计的标准差。该参数控制了去噪的强度,较大的值会更多地去除噪声,但可能会模糊图像的细节。较小的值则可以更好地保留细节,但去噪效果可能不够理想。
  4. hforcolorcomponents:与h相同,但仅用于彩色图像。(通常与H相同)
  5. templateWindowSize: 模板窗口大小,以像素为单位。较大的值可以覆盖更多的像素,从而更好地平滑噪声,但可能会模糊边缘。较小的值则可以更好地保留边缘细节,但去噪效果可能不够理想。
  6. searchWindowSize: 搜索窗口大小,以像素为单位。较大的值可以覆盖更多的像素,从而更好地平滑噪声,但可能会模糊边缘。较小的值则可以更好地保留边缘细节,但去噪效果可能不够理想。

3.6引导滤波去噪

**引导滤波(Guided Filter)**是一种无监督的线性滤波器,它能够根据输入图像和引导图像(Guide Image)来估计输出图像。引导滤波去噪是引导滤波的一种应用,它利用引导图像来指导滤波器去除噪声,从而保留图像的细节。

代码如下:

def guidedfilter(I, p, r, eps):# 获取图像的高度和宽度height, width = I.shape# 计算引导图像I的局部均值m_I = cv2.boxFilter(I, -1, (r, r))# 计算输入图像p的局部均值m_p = cv2.boxFilter(p, -1, (r, r))# 计算引导图像I和输入图像p的局部乘积的均值m_Ip = cv2.boxFilter(I * p, -1, (r, r))# 计算引导图像I和输入图像p的局部协方差cov_Ip = m_Ip - m_I * m_p# 计算引导图像I自身的局部协方差,即局部方差m_II = cv2.boxFilter(I * I, -1, (r, r))var_I = m_II - m_I * m_I# 估计线性系数aa = cov_Ip / (var_I + eps)# 估计线性系数bb = m_p - a * m_I# 对系数a和b进行全局均值滤波,得到平滑的系数m_a = cv2.boxFilter(a, -1, (r, r))m_b = cv2.boxFilter(b, -1, (r, r))# 计算输出图像,即m_a * I + m_breturn m_a * I + m_b

参数说明:
I: 输入图像,可以是灰度图像或彩色图像。
p: 引导图像,用于指导滤波器。引导图像应与输入图像具有相同的尺寸和类型。
r: 引导滤波器的半径,以像素为单位。较大的半径可以覆盖更多的像素,从而更好地平滑噪声,但可能会模糊边缘。较小的半径则可以更好地保留边缘细节,但去噪效果可能不够理想。
eps: 引导滤波器的正则化参数。较大的值可以更好地平滑噪声,但可能会模糊图像的细节。较小的值则可以更好地保留细节,但去噪效果可能不够理想。

3.7小波变换去噪

**小波变换(Wavelet Transform)**是一种在数学和信号处理中常用的分析工具,它能够将一个信号或函数表示为一系列基函数(小波函数)的叠加。这些基函数被称为小波基,它们是具有特定频率和时间特性的函数。小波变换可以将信号分解为不同的频率成分,这些成分称为小波系数。常用的小基波有如下几种:Haar小波、Daubechies小波、Symlet小波等。常用的小波变换集成在pywt库中。

安装:pip install PyWavelets
代码如下:


import numpy as np
import matplotlib.pyplot as plt
from pywt import Wavelet, dwt2, idwt2
# 读取图像
image = plt.imread('image.jpg')  # 假设图像以BGR格式读取
# 转换为灰度图像
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 选择小波基,这里使用的是 'db4'
wavelet = Wavelet('db4')
# 执行二维离散小波变换
coeffs = dwt2(image_gray, wavelet)
# 显示小波系数
titles = ['LL', 'LH', 'HL', 'HH']
coeffs_image = [coeffs[0], coeffs[1][0], coeffs[1][1], coeffs[2]]
for i, a in enumerate(coeffs_image):plt.subplot(2, 2, i + 1), plt.imshow(a, cmap='gray')plt.title(titles[i]), plt.xticks([]), plt.yticks([])plt.show()# 执行逆二维离散小波变换,重构图像
reconstructed_image = idwt2(coeffs, wavelet)
# 显示重构后的图像
plt.imshow(reconstructed_image, cmap='gray')
plt.title('Reconstructed Image'), plt.xticks([]), plt.yticks([])
plt.show()

其中常用的小基波可以选择下面几种:

wavelets = [‘db2’, ‘db4’, ‘db6’, ‘db8’, ‘sym2’, ‘sym4’, ‘sym6’, ‘sym8’, ‘coif1’, ‘coif2’, ‘coif3’, ‘coif4’]

其分别代表:

  1. Daubechies小波 (‘dbN’):
    ○ N 表示滤波器的阶数,N 越大,滤波器越长,光滑性越好。
    ○ 常用的阶数有 db2, db4, db6, db8 等。
  2. Symlet小波 (‘symN’):
    ○ Symlet小波是Daubechies小波的改进版,具有更好的对称性。
    ○ 常用的阶数有 sym2, sym4, sym6, sym8 等。
  3. Coiflet小波 (‘coifN’):
    ○ Coiflet小波提供了比Daubechies小波更高的消失矩。
    ○ 常用的阶数有 coif1, coif2, coif3, coif4 等。
    在选择小波基时,需要考虑以下因素:
    光滑性:阶数较高的Daubechies小波或Symlet小波具有较好的光滑性。
    消失矩:较高的消失矩可以帮助更好地表示信号的瞬时特性。
    对称性:Symlet小波具有更好的对称性,有助于减少相位失真。
    计算复杂度:阶数较高的Daubechies小波计算复杂度较高。
    在实际应用中,通常需要根据具体的需求和图像特性来选择合适的小波基。例如,对于需要较高光滑性的图像,可以选择 db6 或 sym8 作为小波基。对于需要较高消失矩的图像,可以选择 coif4 作为小波基。

相关文章:

opencv-python图像增强一:传统图像去噪方法整理

一、简介: 在数字图像处理领域,噪声一直是影响图像质量的重要因素。无论是拍摄过程中的环境干扰,还是传输过程中的信号失真,噪声都可能导致图像模糊、细节丢失,甚至影响后续的图像分析和应用。为了提高图像的视觉效果…...

Canal单机部署

目录 一、前期准备 1、配置binlog日志 2、配置MQ服务 二、搭建canal 1、下载安装包 2、部署canal-admin的UI管理界面 2-1、创建&解压admin 2-2、配置UI管理界面 2-3、初始化元数据库 2-4、启动Canal Admin 3、部署canal-server服务 3-1、创建&解压deployer…...

java,每日练习02

题目 选自牛客网 1.下列关于Java中类的构造方法的描述,正确的是() A.构造方法的返回类型为void B.可以定义一个类而在代码中不写构造方法。 C.在同一个类中定义的重载构造方法不可以相互调用。 D.子类不允许调用父类的构造方法。 正确答案…...

C# TreeView

添加 TreeView 控件:定义节点:添加节点:设置节点属性:处理节点事件:自定义节点绘制:数据绑定:节点选择:节点展开和折叠:搜索和过滤:示例代码总结 C# 中的 Tre…...

通过xshell使用密钥连接阿里云服务器

目录 步骤1:创建密钥对 步骤2:连接服务器 步骤3:连接服务器 连接阿里云服务器有几种方式,例如有密码进行连接,但是密码连接安全风险较大,所以我们选择密钥方式进行连接。操作简单且安全性高 步骤1&…...

<数据集>路面坑洼识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:681张 标注数量(xml文件个数):681 标注数量(txt文件个数):681 标注类别数:1 标注类别名称:[pothole] 使用标注工具:labelImg 标注规则:对类…...

几个常用脚本

系统初始化 #!/bin/bash # 定义颜色常量 RED\033[0;31m GREEN\033[0;32m NC\033[0m # No Color #功能菜单 menu() {clearecho "请选择要执行的操作:"echo "1. 检查网络"echo "2. 关闭防火墙和SELinux"echo "3. 替换YUM源"echo "…...

gtest中TEST和TEST_F和TEST_P的区别是什么

gtest(Google Test)是Google开发的一个开源的C测试框架,它提供了多种宏来支持不同类型的测试。其中,TEST、TEST_F和TEST_P是三个常用的宏,它们各自有不同的用途和特性。以下是它们之间的主要区别: TEST 用…...

VS2022如何调出输出窗口,并在输出窗口打印日志

在输出窗口打印 System.Diagnostics.Debug.WriteLine("这是一行自定义的输出。Debug.WriteLine");System.Diagnostics.Debug.Write("这是第二行自定义的输出,Debug.Write");System.Diagnostics.Debug.WriteLine("换行");System.Diagn…...

【全国大学生电子设计竞赛】2021年I题

🥰🥰全国大学生电子设计大赛学习资料专栏已开启,限时免费,速速收藏~...

【项目】基于Vue2+Router+Vant 前端面经项目

环境配置 Vue脚手架的创建 在终端中打开输入 vue create 项目包名 -m npm注意⚠️:项目名称不再允许包含大写字母。 选择第三项 3.选择要安装的模块 从上到下的功能模块: Babel - ES:降级处理Router-Vue:路由插件CSS预处理器E…...

【论文阅读】YOLOv10: Real-Time End-to-End Object Detection

题目:YOLOv10: Real-Time End-to-End Object Detection 作者:Ao Wang Hui Chen∗ Lihao Liu Kai Chen Zijia Lin Jungong Han Guiguang Ding∗ 清华大学的 motivation: 作者觉得YOLO系列的NMS和某些结构非常的耗时,提出NMS-free和一些列高效…...

计算资源消耗

计算资源消耗 计算资源的消耗分成: 模型参数本身的存储。模型参数的梯度以及梯度momentum的存储。token的传播过程 例如以llama3-7b为例: 模型参数存储: 模型参数量 * fp32 例如llama3-70b为例,7 * 10^9 * 4 模型参数的梯度以…...

企业微信推送消息的Java实现教程

在这篇教程中,我们将介绍如何使用Java实现企业微信的消息推送功能,特别是在完成任务后,将结果信息通过企业微信推送给指定的用户。我们将基于您提供的代码进行说明。 1. 环境准备 1.1 依赖库 在开始编写代码之前,确保您的项目中…...

强化学习之Actor-Critic算法(基于值函数和策略的结合)——以CartPole环境为例

0.简介 DQN算法作为基于值函数的方法代表,基于值函数的方法只学习一个价值函数。REINFORCE算法作为基于策略的方法代表,基于策略的方法只学习一个策略函数。Actor-Critic算法则结合了两种学习方法,其本质是基于策略的方法,因为其目…...

Linux学习记录(五)-------三类读写函数

文章目录 三种读写函数1.行缓存2.无缓存3.全缓存4.fgets和fputs5.gets和puts 三种读写函数 1.行缓存 遇到新行(\n),或者写满缓存时,即调用系统函数 读:fgets,gets,printf,fprintf,sprintf写:fputs,puts,scanf 2.无缓…...

2024年8月13日(lvs NAT脚本 RS脚本 ds脚本)

lvs-nat模式的优点配置简单,缺点是请求和响应都必须经过ds,容易称为性能瓶颈 希望有这样的模式,请求的时候使用input链进行负载均衡,响应的时候就不要经过ds,直接由rs响应给客户端 在nat模式的时候,请求vip,接收vip的响应 构想 请求vip,接受rip响应,这是不允许lvs-dr模式 NAT脚…...

css实现水滴效果图

效果图&#xff1a; <template><div style"width: 100%;height:500px;padding:20px;"><div class"water"></div></div> </template> <script> export default {data() {return {};},watch: {},created() {},me…...

接口测试面试题目,你都会了吗?

面试题 什么是接口测试&#xff1f; 接口自动化测试的流程是什么&#xff1f; GET请求和POST请求区别是什么&#xff1f; 接口测试的常用工具有哪些&#xff1f; HTTP接口的请求参数类型有哪些&#xff1f; 如何从上一个接口获取相关的响应数据传递到下一个接口&#xff1…...

jmeter-beanshell学习16-自定义函数

之前写了一个从文件获取指定数据&#xff0c;用的时候发现不太好用&#xff0c;写了一大段&#xff0c;只能取出一个数&#xff0c;再想取另一个数&#xff0c;再粘一大段。太不好看了&#xff0c;就想到了函数。查了一下确实可以写。 public int test(a,b){return ab; } ctes…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

C# WPF 左右布局实现学习笔记(1)

开发流程视频&#xff1a; https://www.youtube.com/watch?vCkHyDYeImjY&ab_channelC%23DesignPro Git源码&#xff1a; GitHub - CSharpDesignPro/Page-Navigation-using-MVVM: WPF - Page Navigation using MVVM 1. 新建工程 新建WPF应用&#xff08;.NET Framework) 2.…...

Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用

Linux 内存管理调试分析&#xff1a;ftrace、perf、crash 的系统化使用 Linux 内核内存管理是构成整个内核性能和系统稳定性的基础&#xff0c;但这一子系统结构复杂&#xff0c;常常有设置失败、性能展示不良、OOM 杀进程等问题。要分析这些问题&#xff0c;需要一套工具化、…...

【Linux】使用1Panel 面板让服务器定时自动执行任务

服务器就是一台24小时开机的主机&#xff0c;相比自己家中不定时开关机的主机更适合完成定时任务&#xff0c;例如下载资源、备份上传&#xff0c;或者登录某个网站执行一些操作&#xff0c;只需要编写 脚本&#xff0c;然后让服务器定时来执行这个脚本就可以。 有很多方法实现…...

Java中Git基础操作详解(clone、commit、push、branch)

Git是Java开发者必备的版本控制工具&#xff0c;以下是核心操作的详细说明及示例&#xff1a; ​​一、Git基础概念​​ ​​仓库&#xff08;Repository&#xff09;​​&#xff1a;存储代码的目录&#xff0c;包含所有版本历史。​​提交&#xff08;Commit&#xff09;​​…...

浏览器兼容-polyfill-本地服务-优化

babel和webpack结合 npx babel src --out-dir dist --presetsbabel/preset-env 这是把src下面的东西都用babel转化一下 webpack可以和babel结合使用&#xff0c;首先下载一个这东西&#xff1a; npm install babel-loader -D webpack配置&#xff1a; const path requir…...

Python学习(7) ----- Python起源

&#x1f40d;《Python 的诞生》&#xff1a;一段圣诞假期的奇妙冒险 &#x1f4cd;时间&#xff1a;1989 年圣诞节 在荷兰阿姆斯特丹的一个寒冷冬夜&#xff0c;灯光昏黄、窗外飘着雪。一个程序员 Guido van Rossum 正窝在家里度假——没有会议、没有项目、没有 bug&#xf…...

在React 中安装和配置 shadcn/ui

1. 创建 React 项目 pnpm create vitelatest .选择模板&#xff1a;React TypeScript安装依赖&#xff1a;pnpm install2. 添加 Tailwind CSS pnpm add -D tailwindcss postcss autoprefixer修改 src/index.css 内容&#xff1a; import "tailwindcss";3. 配置 T…...