当前位置: 首页 > 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…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

API网关Kong的鉴权与限流:高并发场景下的核心实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中&#xff0c;API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关&#xff0c;Kong凭借其插件化架构…...