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

news2025/3/28 3:57:33

引言

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

原理

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

 1. 均值滤波(Averaging Filter)

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

 代码示例

import cv2
import numpy as np

def 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]=0
        else:
            result[x,y]=255
    return result

image = 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 np

def 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]=0
        else:
            result[x,y]=255
    return result

image = 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时使用255

boxFilter_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 np

def 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]=0
        else:
            result[x,y]=255
    return result

image = 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 np

def 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]=0
        else:
            result[x,y]=255
    return result

image = 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 np

def 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]=0
        else:
            result[x,y]=255
    return result

image = 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中五种常见的平滑处理方法:均值滤波、高斯滤波、中值滤波和双边滤波。每种方法都有其独特的优势和适用场景:

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

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2321083.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用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条…

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

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

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

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

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)通过视觉和语言指令解…

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

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

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

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

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

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

操作系统导论——第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…

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.…

分布式算法:Paxos Raft 两种共识算法

1. Paxos算法 Paxos算法是 Leslie Lamport(莱斯利兰伯特)在 1990 年提出的一种分布式系统共识算法。也是第一个被证明完备的共识算法(前提是不存在恶意节点)。 1.1 简介 Paxos算法是第一个被证明完备的分布式系统共识算法。共识…

什么是数据库监控

数据库监控是一个综合的过程,涉及观察、分析和优化组织内数据库的性能、运行状况和可用性。通过持续跟踪查询执行时间、CPU使用率、内存消耗和存储I/O等指标,数据库监控使管理员能够主动识别和解决潜在问题。这种对数据库操作的实时可见性对于确保应用程…

Java学习总结-泛型

什么是泛型&#xff1f; 定义 类、接口、方法时&#xff0c;同时声明了一个或多个类型变量&#xff08;如&#xff1a;<E>&#xff09;&#xff0c;称为泛型类、泛型接口、泛型方法、他们统称为泛型。public class ArrayList<E>{ }。 有什么作用呢&#xf…

基于深度学习的相位调制算法步骤

1.构建网络结构 2.制作数据集 3.训练网络 4.引入评价指标 5.迭代优化 总结 通过以上步骤&#xff0c;可以实现基于深度学习的相位调制算法&#xff1a; 使用 U-Net 构建神经网络。 生成数据集并训练网络。 使用训练好的网络预测相位分布。 通过相关系数 γ 评估调制效果&…

Go语言的基础类型

一基础数据类型 一、布尔型&#xff08;Bool&#xff09; 定义&#xff1a;表示逻辑真 / 假&#xff0c;仅有两个值&#xff1a;true 和 false内存占用&#xff1a;1 字节使用场景&#xff1a;条件判断、逻辑运算 二、数值型&#xff08;Numeric&#xff09; 1. 整数类型&…