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

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||超详细的几何变换

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 搭建高可用OpenStack(Queen版)集群(一)之架构环境准备
  • Python面试题:结合Python技术,如何使用PyBrain进行神经网络和机器学习
  • Linux软硬链接和动静态库
  • mybatis-plus雪花算法
  • 装win7出现0x0000007b蓝屏原因分析及解决方法
  • CSS+js:顶部导航栏背景滚动渐变、顶部背景滚动渐变
  • Apache Kafka 事务详解
  • 数据结构之《二叉树》(中)
  • Python爬虫核心面试题2
  • C#用Socket实现TCP客户端
  • 哦吼,新模型?文生图领域的新模型FLUX.1(附模型下载网盘地址和详细使用方法)
  • onceperrequestfilter 不生效问题
  • Centos 安装 Gitlab
  • 数据库文件管理
  • hcip作业1
  • 分享的文章《人生如棋》
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Java反射-动态类加载和重新加载
  • java中具有继承关系的类及其对象初始化顺序
  • js递归,无限分级树形折叠菜单
  • magento2项目上线注意事项
  • Objective-C 中关联引用的概念
  • SAP云平台里Global Account和Sub Account的关系
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 复习Javascript专题(四):js中的深浅拷贝
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 怎么把视频里的音乐提取出来
  • 智能合约Solidity教程-事件和日志(一)
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 昨天1024程序员节,我故意写了个死循环~
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​用户画像从0到100的构建思路
  • (¥1011)-(一千零一拾一元整)输出
  • (16)Reactor的测试——响应式Spring的道法术器
  • (35)远程识别(又称无人机识别)(二)
  • (第二周)效能测试
  • (二)JAVA使用POI操作excel
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (汇总)os模块以及shutil模块对文件的操作
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (四)进入MySQL 【事务】
  • (一)VirtualBox安装增强功能
  • (转)http协议
  • (转)程序员技术练级攻略
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .net core开源商城系统源码,支持可视化布局小程序
  • .Net FrameWork总结
  • .Net Remoting(分离服务程序实现) - Part.3
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NET使用存储过程实现对数据库的增删改查