OpenCV||超详细的图像平滑

ops/2024/9/19 0:50:56/ 标签: opencv, 人工智能, 计算机视觉

消除噪声的工作称为图像平滑

平滑处理算法

  • 基于二维离散卷积的高斯平滑、均值平滑;
  • 基于统计学方法的中值平滑;
  • 具备保持边缘作用的双边滤波、导向滤波。

平滑滤波算法:线性平滑、非线性平滑、自适应平滑

一、线性滤波

1.1 归一化方框滤波器

概述:归一化方框滤波器,也被称为均值滤波器,是图像处理中常用的一种线性滤波技术。其核心思想在于,通过计算图像中每个像素点周围邻域内像素值的平均值,来替代该像素点的原始值,从而达到平滑图像的目的。

特点

  1. 线性:均值滤波是一种线性滤波技术,其输出是输入像素值的线性组合。
  2. 平滑效果:能够有效地去除图像中的随机噪声,但同时也会使图像变得模糊,特别是在图像的边缘部分。
  3. 计算简单:由于只涉及平均值的计算,因此均值滤波的计算复杂度相对较低。

API:

在OpenCV中,均值滤波可以通过cv2.blur()函数实现。该函数的参数包括要处理的图像、核的大小(即窗口的大小)等。需要注意的是,cv2.blur()函数内部实际上已经实现了归一化处理,因此无需额外进行归一化操作。

示例

import cv2  # 读取图像  
img = cv2.imread('path_to_image.jpg')  # 应用均值滤波  
blurred_img = cv2.blur(img, (5, 5))  # 核的大小为5x5  # 显示结果  
cv2.imshow('Original Image', img)  
cv2.imshow('Blurred Image', blurred_img)  
cv2.waitKey(0)  
cv2.destroyAllWindows()

注意事项

  • 核的大小:核的大小会直接影响滤波的效果。核越大,平滑效果越明显,但图像也会变得更加模糊。
  • 噪声类型:均值滤波对于随机噪声(如高斯噪声)有较好的去除效果,但对于某些类型的噪声(如椒盐噪声)效果可能不佳。
  • 边缘效应:由于均值滤波会计算邻域内的平均值,因此在图像的边缘部分可能会出现模糊效应。为了减轻这种效应,可以在滤波前对图像进行边界扩展处理。

1.2 高斯滤波

高斯滤波对去除高斯噪声有很好的效果

概念:高斯滤波通过对图像中的每个像素点应用高斯函数,将其邻域内的像素值加权平均后替换原像素值。高斯函数是一个钟形曲线,其标准差(σ)决定了曲线的宽度和平滑程度。标准差越大,曲线越宽,滤波效果越明显,图像越模糊。

 实现方式

  • 用离散化窗口滑窗卷积(常用)
  • 傅里叶变换(当离散化的窗口非常大、用滑窗计算量非常大的情况使用)

卷积知识

  • 卷积核:用来对图像矩阵进行平滑的矩阵,也称为过滤器;
  • 锚点:卷积核和图像矩阵重叠,进行内积运算后,锚点位置的像素点会被计算值取代。一般选取奇数卷积核的中心点作为锚点。
  • 步长:卷积核沿着图像矩阵每次移动的长度。
  • 内积:卷积核和图像矩阵对应像素点相乘,然后相加得到一个总和(不要和矩阵乘法弄混淆)。

API:

cv2.GaussianBlur()
  • src:输入图像。
  • ksize:高斯核的大小,(宽度, 高度)。宽度和高度都应为正数和奇数,或者可以设置为(0, 0),此时由sigma计算得出。
  • sigmaX:X方向上的高斯核标准差。如果sigmaX为零,则从ksize.width中计算得出;如果两个sigma都为零,则分别从ksize.widthksize.height中计算得出;如果它们都不为零,则分别指定高斯核在X和Y方向上的标准差。
  • sigmaY:Y方向上的高斯核标准差。如果sigmaY为零,则与sigmaX相同。

注意事项

  • 核大小(ksize)和标准差(sigma)是控制高斯滤波效果的关键参数。核越大,标准差越大,图像的平滑效果就越明显,但可能会丢失更多的细节。
  • 在某些情况下,你可能需要根据图像的噪声类型和程度来调整这些参数,以达到最佳的滤波效果。
  • 高斯滤波是一种线性滤波技术,它在平滑图像的同时可能会模糊边缘和细节。因此,在选择滤波参数时需要权衡平滑效果和细节保留之间的平衡。

二、非线性滤波

2.1 中值滤波

概念:中值滤波用像素点领域灰度值的中值来代替该像素点的灰度值,也就是说用一片区域的中间值来代替所有值,可以除去最大值、最小值。

优点:对除去斑点噪声和椒盐噪声很有用,均值滤波噪声也被参与运算。

缺点:中值滤波的时间在均值滤波的5倍以上。

API

dst = cv2.medianBlur(src, ksize)
  • src:源图像,可以是任意数量的单通道图像,数据类型为8位或浮点型。
  • ksize:中值滤波的窗口大小,必须是正奇数(例如3, 5, 7等)。这是中值滤波中最重要的参数。它定义了滤波器窗口的大小,窗口内的像素值将被用来计算中值。由于中值滤波是一个邻域操作,因此窗口大小的选择对滤波效果有显著影响。窗口越大,滤波效果越强,但同时可能会导致图像细节的损失。通常,窗口大小的选择取决于图像中噪声的强度和分布。

注意事项

  • 中值滤波对椒盐噪声特别有效,但可能不适用于其他类型的噪声(如高斯噪声)。
  • 窗口大小的选择应根据具体应用场景和噪声特性进行调整。
  • 滤波后的图像可能会损失一些细节信息,因此在实际应用中需要权衡滤波效果和细节保留之间的关系。

2.2 双边滤波

概念:双边滤波(Bilateral Filter)是一种非常有效的图像去噪技术,它能够在去除噪声的同时很好地保持边缘信息。双边滤波不仅考虑像素之间的空间邻近度,还考虑像素值之间的相似性,这使得它在处理图像时能够同时去除噪声和保持边缘清晰。

优点:

  1. 边缘保持:双边滤波能够很好地保持图像的边缘信息。这是因为它在滤波过程中同时考虑了像素的空间邻近度和颜色相似性。空间上接近且颜色相似的像素会被赋予更高的权重,从而保留了边缘细节。
  2. 去噪能力强:对于图像中的噪声,双边滤波能够有效地去除,特别是对于那些颜色与周围像素差异较大的噪声点(如椒盐噪声)。
  3. 适用范围广:双边滤波不仅适用于灰度图像,也适用于彩色图像。在彩色图像中,它可以分别对每个颜色通道进行处理,或者在转换到适当的颜色空间后进行处理,以更好地去除噪声并保留颜色信息。
  4. 自动卡通化或图画滤波器:双边滤波的强大功能可以使其作为一个自动的卡通化或图画滤波器,通过平滑平坦区域同时保持边缘锐化,使图像看起来更加清晰和生动。

缺点:

  1. 计算复杂度高:双边滤波的计算复杂度相对较高,因为它需要为每个像素点计算其邻域内所有像素点的权重,并根据这些权重进行加权平均。这导致双边滤波的运行时间相对较长,特别是对于大尺寸图像或高分辨率图像。
  2. 可能保留高频噪声:尽管双边滤波在去除噪声方面表现出色,但它可能会保留一些高频噪声,特别是当噪声的颜色与周围像素相似时。这是因为双边滤波在颜色相似性方面也有一定的容忍度,导致一些高频噪声可能无法被完全去除。
  3. 参数选择敏感:双边滤波的效果很大程度上取决于其参数的选择,包括滤波器的直径(d)、颜色空间的标准差(sigmaColor)和坐标空间的标准差(sigmaSpace)。选择合适的参数需要一定的经验和试验,否则可能导致滤波效果不理想。
  4. 可能导致图像模糊:如果参数设置不当,特别是当sigmaSpace值过大时,双边滤波可能会导致图像边缘模糊。这是因为过大的sigmaSpace值会使距离较远的像素点也参与滤波计算,从而模糊了边缘信息。

API

dst = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, borderType=cv2.BORDER_DEFAULT)
  • src:输入图像,即需要进行滤波处理的图像。
  • d:滤波器的直径。这个参数定义了滤波时考虑的邻域范围的大小,它必须是正奇数。直径越大,滤波效果越明显,但同时计算量也越大。
  • sigmaColor:颜色空间的标准差,用于控制颜色相似性的权重。该值越大,表示在颜色上越接近的像素点将具有更大的权重,即更多的颜色将被混合在一起。这有助于去除颜色噪声,但过大的值可能会导致图像颜色过于平滑。
  • sigmaSpace:坐标空间的标准差,用于控制空间邻近度的权重。该值越大,表示在位置上越接近的像素点将具有更大的权重,即更多的像素将被包括在滤波过程中。这有助于去除空间噪声,但过大的值可能会导致边缘模糊。
  • borderType(可选):边界像素的外推方法,默认值为cv2.BORDER_DEFAULT。这个参数在大多数情况下可以保持默认值。

注意事项

  • 选择合适的dsigmaColorsigmaSpace值对于获得理想的滤波效果至关重要。较小的d值会导致较快的处理速度,但可能会错过一些噪声。较大的sigmaColor值会导致更多的颜色混合,可能使图像看起来过于平滑。而sigmaSpace值的选择则需要在去除噪声和保留细节之间找到平衡。
  • 双边滤波在处理具有明显边缘的图像时效果尤为显著,因为它能够在去除噪声的同时保持边缘的清晰度。
  • 由于双边滤波需要同时考虑颜色和空间两个因素,因此其计算量相对较大,处理速度可能不如一些简单的滤波方法。

链接跳转:

章节一、OpenCV||超细节的基本操作

章节二、OpenCV||超简略的Numpy小tip

章节三、OpenCV||超详细的图像处理模块

章节四、OpenCV||超详细的灰度变换和直方图修正

章节六、OpenCV||超详细的几何变换


http://www.ppmy.cn/ops/90413.html

相关文章

【python】Python中位运算算法详细解析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

前端性能优化-webpack构建优化

前言 本文主要总结 webpack 构建优化相关的事情 PS: webpack 的每次更新都会带来很多的新特性,因此学习新知识的时候,不要专注于流程的配置和调参。因为流程终会简化,参数(API)终会升级。要抓大放小,把精力…

G2024-08-06 开源项目日报 Top8

根据Github Trendings的统计,今日(2024-08-06统计)共有8个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目3C项目2JavaScript项目2C++项目2TypeScript项目2Kotlin项目1开发者职业成长指南 创建周期:2670 天开发语言:TypeScript协议类型:Ot…

基于RecyclerView下拉刷新框架拉伸效果微调

基于前一篇 https://blog.csdn.net/jzlhll123/article/details/135222910的研究成果,进一步搞的更好看一点: import android.content.Context; import android.graphics.Canvas; import android.os.Build; import android.util.AttributeSet; import an…

30.x86游戏实战-遍历背包数组

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 工具下载: 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

【mDNS协议】通过UDP广播在局域网内实现设备自动发现和连接的协议

参考链接:https://blog.51cto.com/u_4080467/1387539 简介 mDNS(Multicast DNS)是一种用于设备发现的协议。 mDNS是一种通过UDP广播在局域网内实现设备自动发现和连接的协议,广泛应用于打印机发现、IoT设备连接、文件共享和软件…

【网络】TCP协议——TCP连接相关、TCP连接状态相关、TCP数据传输与控制相关、TCP数据处理和异常、基于TCP应用层协议

文章目录 Linux网络1. TCP协议1.1 TCP连接相关1.1.1 TCP协议段格式1.1.2 确定应答(ACK)机制1.1.3 超时重传机制 1.2 TCP连接状态相关1.2.1 TIME_WAIT状态1.2.2 CLOSE_WAIT 状态 1.3 TCP数据传输与控制相关1.3.1 滑动窗口1.3.2 流量控制1.3.3 拥塞控制1.3.4 延迟应答1.3.5 捎带应…

浅谈【C#】线程锁

一、介绍 在C#中,线程锁是用于同步线程访问共享资源的一种机制,以避免多线程环境下的竞态条件和数据不一致问题。 二、作用 线程锁可以看成在操作系统中的临界区,线程锁区域内的代码表示临界区,使得同一时间只有一个线程能够进入线程锁所包含…

【Golang 面试 - 进阶题】每日 3 题(十四)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…

【Mysql】第二章 库操作(增删改查+备份恢复+编码校验)

文章目录 一、数据库概念二、基本使用1.连接服务器2.管理服务器3.数据库操作创建数据库-create进入数据库-use查看数据库-show创建数据表插入数据-insert into查询表中信息-select * from删除数据库-drop修改数据库-alter备份-mysqldump恢复-source 4.字符集编码格式和校验规则…

2024最简七步完成 将本地项目提交到github仓库方法

2024最简七步完成 将本地项目提交到github仓库方法 文章目录 2024最简七步完成 将本地项目提交到github仓库方法一、前言二、具体步骤1、github仓库创建2、将远程仓库拉取并合并(1)初始化本地仓库(2)本地仓库与Github仓库关联&…

opencv-霍夫变换

霍夫变换(Hough Transform)是一种图像处理技术,用于检测图像中的直线、圆和其他简单形状。它通过将图像空间(像素空间)中的点映射到参数空间,从而将形状检测问题转换为参数空间中的峰值检测问题。霍夫变换最…

AI客服中心6大逆天优势!留住客户都靠它!

在数字化时代的大潮中,企业与客户之间的互动方式正经历着前所未有的变革。随着人工智能技术的飞速发展,AI客服中心作为连接企业与客户的桥梁,正逐步成为企业提升服务品质、增强客户体验的关键力量。它不仅仅是一个技术创新的产物,…

ROS 2 话题:使用C++进行发布与订阅

ROS 2 话题:使用C进行发布与订阅 ROS 2提供了一种强大而灵活的通信机制,称为话题(Topics)。话题允许节点之间进行异步消息传递,从而实现松耦合的通信模式。在本文中,我们将介绍如何使用C编程语言在ROS 2中…

【数据结构】栈篇

文章目录 1. 栈2. 栈的实现2.1 准备工作2.2 栈的初始化2.3 入栈2.4 出栈2.5 判断栈是否为空2.6 取出栈顶元素2.7 获取栈中有效元素个数2.8 销毁栈效果图 3.代码整合 1. 栈 栈是一种特殊的线性表,其只允许固定一端进行插入和删除元素操作。进行数据的插入和删除操作的…

Vue3+Ts项目中经常遇到导入组件,vscode报无法找到模块xxx,xxx隐式拥有 “any“ 类型解决办法~

1、报错截图: 2、解决办法:在确保路径正确的情况下,你会在 src 目录下找到一个名为 env.d.ts 的文件(或者类似的名称)。在这个文件中,你可以声明 .vue 文件的模块类型。例如:(这告诉 TypeScript…

【二叉树+前缀哈希】力扣437. 路径总和 III

给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点&am…

速记Java八股文—— MySQL篇

前言 分类汇总 50 常见的 MySQL篇 经典后端面试题,并对题目进行了精炼总结,旨在帮助大家高效记忆,在面试中游刃有余,不至于陷入词穷的窘境。 MySQL 篇 什么是索引? 索引是数据库中用于加速数据检索的数据结构&#xf…

8.5 day bug

bug1 没有适当的引号,引言就不是真正的引言 问了通义,原来用引言需要使用单引号括起来 bug2 没理解题意,挺好一网站可惜是英文的,顺便帮翻译还没反馈渠道帮… 问了通义,原来是要改变continueLoop的值 bug3 好家伙&a…

【JVM】Java内存区域图文详解

1.JVM运行时区域总览 Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。 JVM运行时区域也成为Java内存区域。 在讨论Java内存模型时,通常将其分为线程共享区域和线程私有区域: 2.线程私有区域 2.1.程序计数器 程序计…