opencv#30 线性滤波

均值滤波原理

均值滤波步骤

Step1:求和。

Step2:计算平均值。

     所谓均值滤波,就是求平均值的意思。我们假设在一个3*3的范围内有一个图像,其中这个图像每一个像素可能含有噪声,也可能不含噪声,我们是不知道的,因此通过均值滤波的方式,对图像中所有像素进行求和,并除以像素个数,得到的结果就是滤波后的结果,将3*3区域的中心位置更改为滤波后的平均值,这样的过程就是均值滤波。

     均值滤波和图像的卷积操作相类似,它们都是在原图像中将每一个像素分别覆盖滤波模板,也可称为滤波器,覆盖原图像后求取平均值,放入中心区域作为滤波结果,然后移动滤波器,使滤波器能够覆盖图像的每一个位置。对于上图3*3的矩阵来说,其中每一个位置都乘了1,也就是说它进行卷积的模板是一个3*3的矩阵,此矩阵中的值都为1,之后又除以了和,因此它的卷积模板(滤波器)就是一个1/9乘全为1的矩阵(3*3)。

均值滤波函数

blur()

void cv::blur(InuputArray   src,OutputArray   dst,Size          ksize,Point         anchor = Point(-1,-1),int           borderType = BORDER_DEFAULT)

·src:待均值滤波的图像,图像数据类型必须是CV_8U,CV_16U,CV_16S,CV_32F和CV_64F这五种数据类型之一。均值滤波输出的结果的数据类型与输入图像的数据类型保持一致。

·dst:均值滤波后的图像,与输入图像具有相同的尺寸和数据类型。

·ksize:卷积核尺寸(滤波器尺寸:常用的是奇数正方形)。因为均值滤波中,滤波器中的每一位参数值是恒定的,因此这里面我们只需给出其尺寸即可。

·anchor:内核的基准点(锚点),其默认值为(-1,-1)代表内核基准点位于kernel的中心位置。·borderType:像素外推法选择标志。

方框滤波函数

boxFilter()

void cv::boxFilter(InputArray   src,OutputArray  dst,int          ddepth,Size         ksize,Point        anchor = Point(-1,-1),bool         normalize = true,int          borderType = BORDER_DEFAULT)

     方框滤波函数与均值滤波其实是等价的,只不过方框滤波运行滤波器不进行归一化,但是在均值滤波中是强制进行归一化的。 由于方框滤波是一个求和的参数,可能会出现255+255+255+....很多个255相加,最终超出255范围的情况,因此第三个参数运行用户设定输出图像的数据类型,也就是输出图像的数据类型可以与输入图像不同,但是尺寸和通道数是一致的。

·src:输入图像。

·dst:输出图像,与输入图像具有相同的尺寸和通道数。

·ddepth:输出图像的数据类型(深度),根据输入图像的数据类型不同拥有不同的取值范围。

·ksize:卷积核尺寸。

·anchor:内核的基准点(锚点),其默认值为(-1,-1)代表内核基准点位于kernel的中心位置。

·normalize:是否将卷积核进行归一化的标志,默认参数为true,表示进行归一化(在矩阵前面乘所有数值之和)。

·borderType:像素外推法选择标志。

高斯滤波原理

     高斯滤波也就是滤波器是一个高斯分布的形式,如上图所示,滤波器中中间的像素值较大,而四周像素值较小的情况,是一个中心对称的滤波器。若以这样的滤波器作为卷积核与原图像进行卷积操作的时候,得到的就是一个高斯滤波之后的结果 。

高斯滤波函数

GaussianBlur()

void cv::GaussianBlur(InputArray    src,OutputArray   dst,Size          xsize,double        sigmaX,double        sigmaY = 0,int           borderType = BORDER_DEFAULT)

·src:待高斯滤波图像,数据类型必须为CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。

·dst:输出图像,与输入图像src具有相同的尺寸,通道数和数据类型。

·ksize:高斯滤波器的尺寸,滤波器可以不为正方形,但是必须是正奇数。如果尺寸为0,则由标准偏差计算尺寸。高斯滤波器不需要人为的输入,因为高斯滤波器的高斯函数分布形式是固定的,只需给出滤波器尺寸即可。

·sigmaX:X方向的高斯滤波器标准偏差。

·sigmaY:Y方向的高斯滤波器标准偏差。如果输入量为0,则将其设置为等于sigmaX,如果两个轴的标准差均为0,则根据输入的高斯滤波器尺寸计算标准差。

ksize ,sigmaX,sigmaY不允许同时为0,若某个参数为0,可以根据对应关系计算出参数。

·borderType:像素外推法选择标志。

示例
#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv; //opencv的命名空间
using namespace std;//主函数
int main()
{Mat lenaGray = imread("E:/opencv/opencv-4.6.0-vc14_vc15/opencv/lenaGray.png");Mat equalLena_Salt = imread("E:/opencv/opencv-4.6.0-vc14_vc15/opencv/equalLena_S.png");Mat equalLena_Gauss = imread("E:/opencv/opencv-4.6.0-vc14_vc15/opencv/equalLena_G.png");if (lenaGray.empty() || equalLena_Salt.empty() || equalLena_Gauss.empty()){cout << "请确认图像名称是否正确" << endl;return -1;}Mat result_3, result_9; //存放不含噪声滤波结果,后面的数字代表滤波器尺寸Mat result_3gauss, result_9gauss; //存放含有高斯噪声滤波结果,后面数字代表滤波器尺寸Mat result_3salt, result_9salt; //存放含有椒盐噪声滤波结果,后面的数字代表滤波器尺寸//调用均值滤波函数blur()进行滤波blur(lenaGray, result_3, Size(3, 3));blur(lenaGray, result_9, Size(9, 9));blur(equalLena_Salt, result_3salt, Size(3, 3));blur(equalLena_Salt, result_9salt, Size(9, 9));blur(equalLena_Gauss, result_3gauss, Size(3, 3));blur(equalLena_Gauss, result_9gauss, Size(9, 9));//显示不含噪声图像imshow("lenaGray", lenaGray);imshow("result_3", result_3);imshow("result_9", result_9);//显示不含噪声图像imshow("equalLena_Salt", equalLena_Salt);imshow("result_3salt", result_3salt);imshow("result_9salt", result_9salt);//显示不含噪声图像imshow("equalLena_Gauss", equalLena_Gauss);imshow("result_3gauss", result_3gauss);imshow("result_9gauss", result_9gauss);cout << "下面是方框滤波" << endl;waitKey(0);//等待函数用于显示图像,按下键盘任意键后退出Mat resultNorm, result;//方框滤波boxFilter()和sqrBoxFilter()boxFilter(lenaGray, resultNorm, -1, Size(3, 3), Point(-1, -1), true); //进行归一化boxFilter(lenaGray, result, -1, Size(3, 3), Point(-1, -1), false); //进行归一化//显示处理结果imshow("resultNorm", resultNorm);imshow("result", result);cout << "下面是高斯滤波" << endl;waitKey(0);//等待函数用于显示图像,按下键盘任意键后退出Mat result_5_G, result_9_G;//存放不含噪声滤结果,后面数字代表滤波器尺寸Mat result_5Gauss_G, result_9Gauss_G;//存放含高斯噪声滤结果,后面数字代表滤波器尺寸Mat result_5Salt_G, result_9Salt_G;//存放含椒盐噪声滤结果,后面数字代表滤波器尺寸GaussianBlur(lenaGray, result_5_G, Size(5, 5), 10, 20);GaussianBlur(lenaGray, result_5_G, Size(5, 5), 10, 20);GaussianBlur(equalLena_Gauss, result_5Gauss_G, Size(5, 5), 10, 20);GaussianBlur(equalLena_Gauss, result_9Gauss_G, Size(9, 9), 10, 20);GaussianBlur(equalLena_Salt, result_5Salt_G, Size(5, 5), 10, 20);GaussianBlur(equalLena_Salt, result_9Salt_G, Size(9, 9), 10, 20);//显示不含噪声图像imshow("lenaGray", lenaGray);imshow("result_5_G", result_5_G);imshow("result_9_G", result_9_G);//显示不含噪声图像imshow("equalLena_Salt", equalLena_Salt);imshow("result_5Gauss_G", result_5Gauss_G);imshow("result_9Gauss_G", result_9Gauss_G);//显示不含噪声图像imshow("equalLena_Gauss", equalLena_Gauss);imshow("result_5Salt_G", result_5Salt_G);imshow("result_9Salt_G", result_9Salt_G);waitKey(0);//等待函数用于显示图像,按下键盘任意键后退出return 0;}

滤波完成后:

在均值滤波中:对于椒盐噪声和高斯噪声的滤波结果,尺寸越大的滤波器,对于图像来说,滤波后的结果也越模糊,噪声产生的影响变小。如果想最大程度的去除噪声,采用均值滤波的形式的话,那么需要一个很大的尺寸,同时对图像的整体质量有较大的影响。

对椒盐噪声,由于我们的均值滤波是每一个像素值都贡献了相同作用,所以对于椒盐噪声来说,仍然可以看出图像中含有椒盐噪声,只不过椒盐噪声的颗粒没有那么亮,没有那么明显,但是椒盐噪声的颗粒变得更粗了。

在方框滤波中:方框滤波中如果进行归一化操作,所得到的结果与均值滤波的结果一致,若不进行归一化操作,那么有可能出现图像中数值远远大于255,但是在opencv中,会强制为255,所以导致整个图像中,较大的区域都为白色,而有纹理的恰恰是原图像中较暗的区域。

在高斯滤波中:顾名思义对高斯噪声的滤波更为理想。结果也会变得模糊,但是处理结果也较好。若图像中含有椒盐噪声,采用线性滤波的方式得到的结果不太理想。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

当pytest遇上poium会擦出什么火花

当pytest遇上poium会擦出什么火花 首先&#xff0c;创建一个test_sample/test_demo.py 文件&#xff0c;写入下面三行代码。 def test_bing(page):page.get("https://www.bing.com")assert page.get_title "必应"不要问题 page 从哪里来&#xff0c;打开…

冷链温湿度监控解决方案,实时监测,助力运输安全

为了确保药品、生鲜等在冷链运输过程中的安全监管,需要对冷链、仓库等环节的温湿度信息进行实时自动检测和记录&#xff0c;有效防范储运过程中可能影响产品质量安全的各类风险&#xff0c;确保储存和运输过程的产品质量。 冷链温湿度监控系统解决方案&#xff0c;利用智能温湿…

【C++语言1】基本语法

前言 &#x1f493;作者简介&#xff1a; 加油&#xff0c;旭杏&#xff0c;目前大二&#xff0c;正在学习C&#xff0c;数据结构等&#x1f440; &#x1f493;作者主页&#xff1a;加油&#xff0c;旭杏的主页&#x1f440; ⏩本文收录在&#xff1a;再识C进阶的专栏&#x1…

超优秀的三维模型轻量化、格式转换、可视化部署平台!

1、基于 HTML5 和 WebGL 技术&#xff0c;可在主流浏览器上进行快速浏览和调试&#xff0c;支持PC端和移动端 2、自主研发 AMRT 展示框架和9大核心技术&#xff0c;支持3D模型全网多端流畅展示与交互 3、提供格式转换、减面展UV、烘焙等多项单模型和倾斜摄影模型轻量化服务 4、…

削峰填谷与应用间解耦:分布式消息中间件在分布式环境下并发流量控制的应用

这是《百图解码支付系统设计与实现》专栏系列文章中的第&#xff08;18&#xff09;篇&#xff0c;也是流量控制系列的第&#xff08;4&#xff09;篇。点击上方关注&#xff0c;深入了解支付系统的方方面面。 本篇重点讲清楚分布式消息中间件的特点&#xff0c;常见消息中间件…

图神经网络X项目|基于图神经网络的电商行为的预测(5%)

文章目录 Jupyter Notebook 学习人工智能的好帮手数据集数据集下载数据集调用数据集应用技巧——获取不重复的编号数据集应用技巧——随机采样数据集应用技巧——抽取前N项进行模拟测试 数据集构建技巧一——查看数据集构建进度 Jupyter Notebook 学习人工智能的好帮手 【Jupy…

自动化测试总结

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 软件测试作为软件生命周期中不可缺少的组成部分&#xff0c;对提…

Final Cut Pro v10.7.1中文版 专业级视频剪辑软件 兼容M

Final Cut Pro 是 macOS平台上最好的视频剪辑软件&#xff0c;基于Cocoa编写&#xff0c;支持多路多核心处理器&#xff0c;支持GPU加速&#xff0c;支持后台渲染&#xff0c;可编辑从标清到4K的各种分辨率视频&#xff0c;ColorSync管理的色彩流水线则可保证全片色彩的一致性。…

【QT+QGIS跨平台编译】之六:【LZMA+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、lzma介绍二、文件下载三、文件分析四、pro文件五、编译实践一、lzma介绍 LZMA(Lempel-Ziv-Markov chain-Algorithm的缩写),是一个Deflate和LZ77算法改良和优化后的压缩算法。 libLzma是基于LZMA压缩算法封装的开源库。2001年被首次应用于7-Zip压缩工具中,是 …

架构篇09:架构设计原则案例

文章目录 淘宝案例手机QQ案例小结 我们先复习一下架构设计的三条核心原则&#xff1a;合适原则、简单原则和演化原则。 我们在架构设计实践中&#xff0c;应该时刻谨记这三条设计原则&#xff0c;指导我们设计出合适的架构&#xff0c;即使是代表中国互联网技术最顶尖水平的 BA…

【易经】-- 风水基础

目录 一、基础概念 1、五行 2、十天干 3、十二地支 4、八卦 4.1 伏羲八卦次序图 4.2 八卦对应自然界的基本事物 4.3 八卦及所代表的意像 ​编辑 5、生辰八字 5.1 定义 5.2 换算方法 5.3 举例 5.4 八字排盘示例 5.5 算法实现 二、举例 1、计算某年的生肖和年的属…

CSS之边框样式

让我为大家介绍一下边框样式吧&#xff01;如果大家想更进一步了解边框的使用&#xff0c;可以阅读这一篇文章&#xff1a;CSS边框border 属性描述none没有边框,即忽略所有边框的宽度(默认值)solid边框为单实线dashed边框为虚线dotted边框为点线double边框为双实线 代码演示&…