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

OpenCV平滑处理:图像去噪与模糊技术详解

引言

        在图像处理中,噪声是一个常见的问题,它可能来自于图像采集设备、传输过程或环境干扰。为了去除噪声并改善图像质量,平滑处理(Smoothing)是一种常用的技术。OpenCV提供了多种平滑处理方法,包括均值滤波、高斯滤波和中值滤波。本文将详细介绍这些方法,并通过代码示例展示它们的实际效果。

原理

      平滑处理是一种通过对图像进行滤波来去除噪声的技术。它的基本原理是利用像素邻域内的像素值来替代当前像素值,从而减少噪声的影响。常见的平滑处理方法包括均值滤波、高斯滤波和中值滤波,每种方法都有其独特的优势和适用场景。

 1. 均值滤波(Averaging Filter)

        均值滤波是最简单的平滑处理方法之一。它通过计算像素邻域内像素值的平均值来替代当前像素值。均值滤波可以有效地去除噪声,但也会导致图像变得模糊。
     均值滤波使用一个归一化的卷积核(通常是正方形)对图像进行卷积操作。例如,一个3x3或者5x5的卷积核

 代码示例

import cv2
import numpy as npdef add_peppersalt_noise(image,n=10000):result = image.copy()h,w = image.shape[:2]for i in range(n):x = np.random.randint(1,h)y = np.random.randint(1,w)if np.random.randint(0,2)==0:result[x,y]=0else:result[x,y]=255return resultimage = cv2.imread('csdn_test.png')
cv2.imshow('yntu',image)
cv2.waitKey(0)noise=add_peppersalt_noise(image)
cv2.imshow('noise',noise)
cv2.waitKey(0)''' 均值滤波'''
#  dst=cv2.blur(src,ksize,anchor,borderType)
#      dst是返回值
#      src是需要处理的图像
#      kszie是滤波核(卷积核)的大小
#      anchor是锚点,默认值是(-1,-1)一般无需更改
#      borderType是边界样式,一般无需更改
#
# 一般情况下,使用dst=cv2.blur(src,ksize)即可
#
blur_1=cv2.blur(noise,(3,3))
cv2.imshow('blur_1',blur_1)
cv2.waitKey(0)blur_2=cv2.blur(noise,(5,5))
cv2.imshow('blur_2',blur_2)
cv2.waitKey(0)
cv2.destroyAllWindows()

- 均值滤波后的图像:噪声减少,但图像变得模糊。

2. 方框滤波(Box Filter)

     方框滤波是一种简单的线性滤波方法,它通过计算像素邻域内像素值的平均值来替代当前像素值。与均值滤波类似,但方框滤波可以选择是否对结果进行归一化。

     框滤波使用一个矩形卷积核对图像进行卷积操作。如果选择归一化,则结果与均值滤波相同;如果不归一化,则直接对像素值求和。

代码示例

import cv2
import numpy as npdef add_peppersalt_noise(image,n=10000):result = image.copy()h,w = image.shape[:2]for i in range(n):x = np.random.randint(1,h)y = np.random.randint(1,w)if np.random.randint(0,2)==0:result[x,y]=0else:result[x,y]=255return resultimage = cv2.imread('csdn_test.png')
cv2.imshow('yntu',image)
cv2.waitKey(0)noise=add_peppersalt_noise(image)
cv2.imshow('noise',noise)
cv2.waitKey(0)'''方框滤波'''# dst=cv2.boxFilter (src,ddepth,ksize,anchor,normalize,borderType)式中:
#     dst是返回值,表示进行方框滤波后得到的处理结果。
#     src 是需要处理的图像,即原始图像。
#     ddepth是处理结果图像的图像深度,一般使用-1表示与原始图像使用相同的图像深度。(可以理解为数据类型)
#     ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中所选择的邻域图像的高度和宽度。
#     anchor 是错点,(指对应哪个区域)
#     normalize 表示在滤波时是否进行归一化。
#       1.当值为True时,归一化,用邻域像素值的和除以面积。此时方框滤波与均值滤波效果相同#
#       2.当值为False时,不归一化,直接使用邻域像素值的和。和>255时使用255boxFilter_1=cv2.boxFilter(noise,-1,(3,3),normalize=True)
cv2.imshow('boxFilter_1',boxFilter_1)
cv2.waitKey(0)boxFilter_2=cv2.boxFilter(noise,-1,(3,3),normalize=False)
cv2.imshow('boxFilter_2',boxFilter_2)
cv2.waitKey(0)
cv2.destroyAllWindows()

  • 归一化的方框滤波:与均值滤波效果相同。

  • 不归一化的方框滤波:像素值可能超出范围,图像变亮或变暗。

 

3. 高斯滤波(Gaussian Filter)

      高斯滤波是一种基于高斯函数的平滑处理方法。与均值滤波不同,高斯滤波在计算像素值时,会给邻域内的像素赋予不同的权重,距离中心像素越近的像素权重越大。这种方法在去除噪声的同时,能够更好地保留图像的边缘信息。
      高斯滤波使用一个高斯核进行卷积操作。高斯核的权重由高斯函数计算得出,例如一个3x3或者5x5的高斯核。

代码示例

import cv2
import numpy as npdef add_peppersalt_noise(image,n=10000):result = image.copy()h,w = image.shape[:2]for i in range(n):x = np.random.randint(1,h)y = np.random.randint(1,w)if np.random.randint(0,2)==0:result[x,y]=0else:result[x,y]=255return resultimage = cv2.imread('csdn_test.png')
cv2.imshow('yntu',image)
cv2.waitKey(0)noise=add_peppersalt_noise(image)
cv2.imshow('noise',noise)
cv2.waitKey(0)'''高斯滤波'''
# cv2.GaussianBlur(src,ksize,[,sigmaX[,sigmaY[,dst]]])高斯滤波   或
# cv2.GaussianBlur(src,ksize, sigmaX[, dst[, sigmaY[, borderType]]]) → dst
#
#     src:输入图像,通常是一个numpy数组。
#     ksize:滤波器的大小,它是一个元组,表示在水平和垂直方向上的像素数量。例如,(5,5)表示一个5x5的滤波器。
#     siqmaX和siqmaY:分别表示在X轴Y轴方向上的标准差。这些值与滤波器大小相同。默认情况下,它们都等于0,这意味着没有高斯模糊
#     dst:输出图像,通常是一个numpy数组。如果为one,则会创建一个新的数组来存储结果。
#     borderType (可选):
#        边界填充类型。默认是 cv2.BORDER_DEFAULT,表示使用镜像边界填充。其他可选值包括:
#        cv2.BORDER_CONSTANT: 使用常数填充边界。
#        cv2.BORDER_REPLICATE: 复制边界像素。
#        cv2.BORDER_REFLECT: 镜像反射边界。
#        cv2.BORDER_WRAP: 环绕边界
GaussianB=cv2.GaussianBlur(noise,(3,3),1)
cv2.imshow('GaussianBlur',GaussianB)
cv2.waitKey(0)
cv2.destroyAllWindows()

- 高斯滤波后的图像:噪声减少,边缘信息保留较好。

4. 中值滤波(Median Filter)

     中值滤波是一种非线性平滑处理方法,它通过计算像素邻域内像素值的中值来替代当前像素值。中值滤波特别适合去除椒盐噪声(Salt-and-Pepper Noise),同时能够较好地保留图像的边缘信息。

中值滤波不需要卷积核,而是直接对邻域内的像素值进行排序,然后取中值作为当前像素值。

 代码示例

import cv2
import numpy as npdef add_peppersalt_noise(image,n=10000):result = image.copy()h,w = image.shape[:2]for i in range(n):x = np.random.randint(1,h)y = np.random.randint(1,w)if np.random.randint(0,2)==0:result[x,y]=0else:result[x,y]=255return resultimage = cv2.imread('csdn_test.png')
cv2.imshow('yntu',image)
cv2.waitKey(0)noise=add_peppersalt_noise(image)
cv2.imshow('noise',noise)
cv2.waitKey(0)'''中值滤波'''
#cv2.medianBlur(src,ksizel,dst])中值滤波
#    src:输入图像。# # ksize:滤波器的大小,它是一个整数,表示在水平和垂直方向上的像素数量。例如,5表示:一个5x5 的滤波器
#    dst:输出图像,通常是一个umPy数组。如果为None,则会创建一个新的数组来存储结果。medianB=cv2.medianBlur(noise,3)
cv2.imshow('medianBlur',medianB)
cv2.waitKey(0)
cv2.destroyAllWindows()


- 中值滤波后的图像:椒盐噪声被有效去除,边缘信息保留较好。

 5. 双边滤波(Bilateral Filter)

     双边滤波是一种非线性的平滑处理方法,它不仅考虑像素的空间距离,还考虑像素值的相似性。因此,双边滤波在去除噪声的同时,能够很好地保留图像的边缘信息。
     双边滤波使用两个高斯核:一个用于空间距离,另一个用于像素值差异。通过这种方式,双边滤波可以在平滑图像的同时保留边缘。

代码示例

import cv2
import numpy as npdef add_peppersalt_noise(image,n=10000):result = image.copy()h,w = image.shape[:2]for i in range(n):x = np.random.randint(1,h)y = np.random.randint(1,w)if np.random.randint(0,2)==0:result[x,y]=0else:result[x,y]=255return resultimage = cv2.imread('csdn_test.png')
cv2.imshow('yntu',image)
cv2.waitKey(0)noise=add_peppersalt_noise(image)
cv2.imshow('noise',noise)
cv2.waitKey(0)''' 双边滤波'''
#cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]]) -> dst
#参数说明:
# src:输入图像,可以是8位或浮点型单通道或三通道图像。(numpy.ndarray 类型)
# d: 滤波过程中每个像素邻域的直径,如果设为非正数,则根据sigmaSpace自动计算直径。(类型:int)
# sigmaColor:颜色空间的标准差,用于控制像素值差异的权重。值越大,表明像素值差异较大的像素也会被考虑进来,滤波效果越明显。(类型:float)
# sigmaSpace:坐标空间的标准差,用于控制空间距离的权重。值越大,表明距离较远的像素也会被考虑进来,滤波效果越明显。(类型:float)
# dst(可选):输出图像,与输入图像src具有相同的尺寸和类型。如果未提供,函数会创建一个新的数组。(类型:numpy.ndarray)
# borderType(可选):边界填充方式。OpenCV提供了多种边界填充方式,如cv2.BORDER_CONSTANT、cv2.BORDER_REFLECT等。默认值为cv2.BORDER_DEFAULT。bilateral_blurred = cv2.bilateralFilter(image, 9, 75, 75)
cv2.imshow('Bilateral Blurred Image', bilateral_blurred)
cv2.waitKey(0)
cv2.destroyAllWindows()


- 双边滤波后的图像:噪声减少,边缘信息保留非常好。

总结

      平滑处理是图像处理中的重要技术,能够有效去除噪声并改善图像质量。本文介绍了OpenCV中五种常见的平滑处理方法:均值滤波、高斯滤波、中值滤波和双边滤波。每种方法都有其独特的优势和适用场景:

  • 均值滤波:简单快速,适合一般噪声去除。

  • 方框滤波:灵活选择是否归一化,适合特定场景。

  • 高斯滤波:保留边缘信息,适合需要保留细节的场景。

  • 中值滤波:适合去除椒盐噪声。

  • 双边滤波:在去除噪声的同时,能够很好地保留边缘信息。

通过掌握这些方法,你可以根据实际需求选择合适的平滑处理技术,提升图像处理的效果。

相关文章:

OpenCV平滑处理:图像去噪与模糊技术详解

引言 在图像处理中,噪声是一个常见的问题,它可能来自于图像采集设备、传输过程或环境干扰。为了去除噪声并改善图像质量,平滑处理(Smoothing)是一种常用的技术。OpenCV提供了多种平滑处理方法,包括均值滤波…...

【LeetCode】大厂面试算法真题回忆(36)--相同数字的积木游戏

题目描述 小华和小薇一起通过玩积木游戏学习数学。他们有很多积木,每个积木块上都有一个数字,积木块上的数字可能相同。 小华随机拿一些积木挨着排成一排,请小薇找到这排积木中数字相同且所处位置最远的2块积木块,计算他们的距离…...

使用Python将视频转化为gif

使用Python将视频转化为gif 一、前言二、准备三、测试 一、前言 最近想把喜欢的视频片段作成gif,就试着用Python做了下,感觉效果还行,这里做个记录。 二、准备 先下载安装对应的库,命令如下: pip install moviepy …...

HTTP长连接与短连接的前世今生

HTTP长连接与短连接的前世今生 大家好!作为一名在互联网摸爬滚打多年的开发者,今天想跟大家聊聊HTTP中的长连接和短连接这个话题。 记得我刚入行时,对这些概念一头雾水,希望这篇文章能帮助新入行的朋友少走些弯路。 什么是HTTP…...

批量将 PPT 文档中的图片提取到文件夹

在 PPT 文档中我们可以插入很多的图片来丰富我们的幻灯片页面,但是当我们需要将 PPT 幻灯片中的图片提取出来的时候,会非常的麻烦,因为我们需要打开 PPT 然后将图片保存起来。会非常的耗费我们的时间和精力。今天给大家介绍的就是一种批量将 …...

yolo目标检测算法在DJI上的研究分析(大纲)

yolo目标检测算法在DJI上的研究分析 面向边缘计算的实时目标检测系统设计与部署 第一章 绪论 1.1 研究背景与意义 目标检测技术需求: DJI设备(如无人机、摄像头)在安防、巡检、农业等场景中的广泛应用现有YOLO算法在高分辨率图像或资源受限…...

图像处理篇:图像预处理——从数据到模型的桥梁

图像预处理是计算机视觉任务中至关重要的一环,它直接影响模型的训练效果和推理性能。无论是深度学习还是传统机器学习,图像预处理都是不可或缺的步骤。本文将深入探讨图像预处理的核心技术、常见方法及其在实际应用中的最佳实践,帮助你从零开…...

MyBatisPlus(SpringBoot版)学习第二讲:基本CRUD

目录 1.BaseMapper 2. 基本CRUD 1. 插入一条记录 2. 删除 1>. 根据ID删除 2>. 根据实体(ID)删除 3>. 根据columnMap条件删除 4>. 根据entity条件删除 5>. 根据ID批量删除 3. 修改 1>. 根据ID修改 2>. 根据whereEntity条…...

SAP-ABAP:SAP系统架构技术白皮书

SAP系统架构技术白皮书 模块化设计 高性能扩展 智能优化 一、核心架构:三层模型技术解析 架构拓扑图 [用户端] ←HTTP/DIAG→ [应用服务器集群] ←SQL→ [数据库服务器] │ │ └─SAP GUI/Web───┘ 分层技术指标对比 架构层组件构成性能…...

Django REST Framework 请求封装源码解析与实现流程

版本说明: Django: V4.2.20 Django Rest Framework: V3.15.2 一、核心封装流程示意图 #mermaid-svg-qXJLIa9Bx1TCiPSN {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qXJLIa9Bx1TCiPSN .error-icon{fill…...

RK3588开发笔记-buildroot添加telnet服务

目录 前言 一、Telnet服务背景与适用场景 二、telnet服务开启 Busybox 配置 三、固件编译及烧录 RK3588烧录验证 客户端连接测试 3.1 Linux/MacOS连接 3.2 Windows连接 总结 前言 本文主要介绍在RK3588 SDK文件包中添加telnet服务,由于sdk buildroot默认添加的是ssh服…...

基于Spring Boot的企业内管信息化系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...

Bitcoin Thunderbolt 内测通道开启,加速比特币交易新时代

比特币作为全球领先的加密货币,一直占据着去中心化金融的核心地位。然而,随着比特币生态的不断扩展,其交易速度和扩容问题逐渐成为制约发展的关键瓶颈。为解决这一难题, 比特币雷电网络(Bitcoin Thunderbolt&#xff0…...

STM32 模拟SPI 模式0

SPI 模式 0 的时钟极性(CPOL)为 0,时钟相位(CPHA)为 0。CPOL 0 意味着时钟信号空闲时为低电平,CPHA 0 表示在时钟信号的第一个跳变沿(上升沿)进行数据采样。 #include "stm3…...

QT笔记----QCheckBox

文章目录 概要1、QCheckBox 的基本概念2、单个QCheckBox3、多个QCheckBox同时应用3.1、实现效果3.2、实现Demo 概要 在 Qt 应用程序开发中,QCheckBox 是一个常用的用户界面元素,它允许用户在两种状态(选中和未选中)之间进行切换&a…...

GR00T N1——英伟达开源的通用人形VLA:类似Helix的快与慢双系统,且可类似ViLLA利用海量的无标注视频做训练

前言 就在昨天3.19日的凌晨,英伟达发布的GR00T N1还是很有含金量的(上午已有好几个朋友私我了),由此可以看到很多相关工作的影子,比如helix π0 LAPA,具体而言,其具有双系统架构 VLM模块(系统2)通过视觉和语言指令解…...

Bash 脚本基础

一、Bash 脚本基础 什么是 Bash 脚本:Bash 脚本是一种文本文件,其中包含了一系列的命令,这些命令可以被 Bash shell 执行。它用于自动化重复性的任务,提高工作效率。 Bash 脚本的基本结构:以 #!/bin/bash 开头&#x…...

SQLite Delete 语句详解

SQLite Delete 语句详解 SQLite 是一种轻量级的数据库管理系统,广泛应用于移动设备、嵌入式系统和服务器端应用。在数据库管理中,删除数据是一项基本操作。SQLite 提供了强大的删除功能,本文将详细介绍 SQLite 的 Delete 语句及其用法。 1.…...

Mysql深分页的解决方案

在数据量非常大的情况下,深分页查询则变得很常见,深分页会导致MySQL需要扫描大量前面的数据,从而效率低下。例如,使用LIMIT 100000, 10时,MySQL需要扫描前100000条数据才能找到第10000页的数据。 在MySQL中解决深分页…...

数据建模流程: 概念模型>>逻辑模型>>物理模型

数据建模流程 概念模型 概念模型是一种高层次的数据模型,用于描述系统中的关键业务概念及其之间的关系。它主要关注业务需求和数据需求,而不涉及具体的技术实现细节。概念模型通常用于在项目初期帮助业务人员和技术人员达成共识,确保对业务需…...

光谱仪与光谱相机的核心区别与协同应用

一、核心功能与数据维度 ‌光谱仪‌ ‌功能定位‌:专注单点或线状区域的光谱分析,通过色散元件(光栅/棱镜)分离波长,生成一维或二维光谱曲线,用于量化光强、吸收率等参数‌。 ‌数据维度‌:输…...

路由工程师大纲-2:结合AI技术构建路由拓扑与BGP异常检测的知识链体系

一、领域交叉技术图谱 1. 路由拓扑测绘: 图神经网络(GNN):建模网络结构,预测链路稳定性。复杂网络分析:计算节点中心性(如PageRank)、社区发现(Louvain算法)。可视化工具:Gephi/NetworkX + PyTorch Geometric(图嵌入)。2. BGP异常检测: 时间序列模型:LSTM/Tran…...

运行时智控:PanLang 开发者指南(一)运行时系统核心模块实现——PanLang 原型全栈设计方案与实验性探索5

运行时智控:PanLang 开发者指南(一)运行时系统核心模块实现——PanLang 原型全栈设计方案与实验性探索5 文章目录 运行时智控:PanLang 开发者指南(一)运行时系统核心模块实现——PanLang 原型全栈设计方案与…...

再次理解 Spring 中的 IOC、DI、AOP 与多态

目录 引言 1. IOC(控制反转) 1.1 什么是 IOC? 1.2 IOC 的核心思想 1.3 IOC 的实现 2. DI(依赖注入) 2.1 什么是 DI? 2.2 DI 的实现方式 2.3 DI 的核心作用 3. AOP(面向切面编程&#x…...

rocky linux 与centos系统的区别

Rocky Linux 和 CentOS 都是基于 Red Hat Enterprise Linux(RHEL)的社区发行版,但两者在目标定位、更新策略和社区管理上有显著差异。以下是核心区别的详细对比: 一、背景与定位 特性Rocky LinuxCentOS起源由 CentOS 联合创始人…...

操作系统导论——第13章 抽象:地址空间

一、早期系统 从内存来看,早期的机器并没有提供多少抽象给用户。基本上,机器的物理内存如图13.1所示 操作系统曾经是一组函数(实际上是一个库),在内存中(在本例中,从物理地址0开始)&…...

C# 调用 VITS,推理模型 将文字转wav音频net8.0 跨平台

一、系统环境 操作系统:win10,win11 运行环境:dotnet8 工具:命令行,powershell 开源库:sherpa-onnx 二、工具和源码下载 开源库:https://k2-fsa.github.io/sherpa/onnx/index.html 运行环境下载 https://dotnet.microsoft.c…...

织梦DedeCMS如何获得在列表和文章页获得顶级或上级栏目名称

获得顶级或二级栏目的名称,都需要修改php文件,修改的文件【/include/common.func.php】将代码插入到这个文件的最下面即可; 一、获得当前文章或栏目的【顶级栏目】名称 1、插入顶级栏目代段 //获取顶级栏目名 function GetTopTypename($id…...

深度学习仓库代码结构认识

规范化深度学习代码仓库的目录结构和文件组织方式,以便于代码的管理、协作和复现性。 一种供参考的目录树结构: . ├── README.md ├── requirements.txt ├── data/ ├── docs/ ├── logs/ └── src/├── configs/│ └── config.y…...

C#基于MVC模式实现TCP三次握手,附带简易日志管理模块

C#基于MVC模式实现TCP三次握手 1 Model1.1 ServerModel1.2 ClientModel1.3 配置参数模块1.4 日志管理模块1.4.1 数据结构1.4.1 日志管理工具类1.4.1 日志视图展示1.4.1.1 UcLogManage.cs1.4.1.2 UcLogManage.Designer.cs 2 视图(View)2.1 ViewServer2.1.…...