opencv#30 线性滤波

news2024/11/25 3:05:46

均值滤波原理

均值滤波步骤

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.coloradmin.cn/o/1404528.html

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

相关文章

【CentOS】Linux 在线帮助文档命令:help、man 命令与文档汉化

目录 1、Linux 的命令行模式 2、help 命令 3、man 命令 4、man 命令输出文档汉化 注&#xff1a;本文档使用 Linux 版本为 CentOS 7.9 [swadianlocalhost ~]$ cat /etc/centos-release CentOS Linux release 7.9.2009 (Core) 1、Linux 的命令行模式 一般情况下&#xff0…

VUE中获取数据方式(axios)详细介绍

众所周知&#xff0c;我们现在大多采用前后端分离的模式来开发项目&#xff0c;前端项目个人采用vue做的比较多一点&#xff0c;既然是前端&#xff0c;那肯定只是负责渲染展示数据&#xff0c;那么问题来了&#xff0c;数据从哪里来&#xff1f;开发阶段大多数据采用mock做一些…

k8s-kubectl常用命令

一、基础命令 1.1 get 查询集群所有资源的详细信息&#xff0c;resource包括集群节点、运行的Pod、Deployment、Service等。 1.1.1 查询Pod kubectl get po -o wid 1.1.2 查询所有NameSpace kubectl get namespace 1.1.3 查询NameSpace下Pod kubectl get po --all-namespaces…

Qt顶部圆角窗体

Qt&#xff1a;实现顶层窗体圆角_qt 圆角窗口弹窗-CSDN博客 setWindowFlags(Qt::FramelessWindowHint);QBitmap bmp(this->size());bmp.fill();QPainter p(&bmp);p.setPen(Qt::NoPen);p.setBrush(Qt::black);p.setRenderHint(QPainter::Antialiasing);p.drawRoundedRec…

HEGERLS智能物流机器人|场景为王 以存取为技术核心布局的仓储集群

随着物流需求的多样化、复杂化&#xff0c;四向穿梭车技术经过几年的蓬勃发展&#xff0c;正在各领域迎来愈加广泛的应用。河北沃克作为该领域的代表&#xff0c;凭借庞大的产品群、功能强大的软件系统以及资源丰富的生态合作伙伴体系实现了快速的发展。其中&#xff0c;海格里…

【江科大】STM32:TIM输入捕获(理论部分)

文章目录 IC&#xff08;Input Capture&#xff09;输入捕获PWM频率 知识点补充1. 滤波器的工作原理&#xff1a;2. 边沿检测器&#xff1a;自动化清零CNT输入捕获的基本结构PWMI基本结构滤波器和分频器的区别误差分析pwm.cmain.cIC.c PWM模式测频率和占空比 IC&#xff08;Inp…

Leetcode—40.组合总和II【中等】

2023每日刷题&#xff08;七十七&#xff09; Leetcode—40.组合总和II 算法思想 实现代码 class Solution { public:vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {vector<vector<int>> ans;vector<int…

i18n多国语言Internationalization的动态实现

一、数据动态的更新 在上一篇i18n多国语言Internationalization的实现-CSDN博客&#xff0c;可能会遇到一个问题&#xff0c;我们在进行英文或中文切换时&#xff0c;并没有办法对当前的数据进行动态的更新。指的是什么意思呢&#xff1f;当前app.js当中一个组件内容&#xff…

shell脚本概述

将命令写到脚本里面&#xff0c;利用路径或者解释器去执行。简要来说脚本其实就是命令的集合。 例如&#xff1a;echo $&#xff1f; 自定义变量&#xff0c;查看上次命令执行是否正确 linux常用的shell 脚本的构成&#xff1a; 1.解释器 &#xff08;脚本是用什么语言写的…

Linux如何将文件或目录打成rpm包? -- fpm打包详解

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

C++面试宝典第23题:乌托邦树

题目 乌托邦树每年经历2个生长周期。每年春天,它的高度都会翻倍。每年夏天,他的高度都会增加1米。对于一颗在春天开始时种下的高为1米的树,问经过指定周期后,树的高度为多少? 输入描述:输入一个数字N(0 <= N <= 1000),表示指定周期。 比如:样例输入为3。 输出描…

怎么提升数据分析能力?——功法篇(下)

先来复习一下上篇提到的3个疑问&#xff1a; 为什么我做出来的分析总觉得没有别人的那么高级&#xff1f; 老板为什么总说我的分析“太浅了”&#xff1f; 数据分析师每天的工作就是取数做需求&#xff1f; 看完上篇讲的金字塔原理&#xff0c;如果你还有疑问&#xff0c;不妨再…

react 实现页面状态缓存(keep-alive)

前言&#xff1a; 因为 react、vue都是单页面应用&#xff0c;路由跳转时&#xff0c;就会销毁上一个页面的组件。但是有些项目不想被销毁&#xff0c;想保存状态。 比如&#xff1a;h5项目跳转其他页面返回时&#xff0c;页面状态不丢失。设想一个 页面我滑倒了中间&#xf…

Modbus网关BL101 既实现Modbus转MQTT,还能当串口服务器使用

随着工业4.0的迅猛发展&#xff0c;人们深刻认识到在工业生产和生活中&#xff0c;实时、可靠、安全的数据传输至关重要。在此背景下&#xff0c;高性能的工业电力数据传输解决方案——协议转换网关应运而生&#xff0c;广泛应用于工业自动化系统、远程监控和物联网应用应用环境…

三大队在线看

三大队超清完整资源 关注公众号&#xff0c;回复关键字 “三大队” 即可获取网盘资源&#xff08;可在线看&#xff09;&#xff0c;真诚分享无套路

风二西CTF流量题大集合-刷题笔记|NSSCTF流量题(1)

2.[鹤城杯 2021]流量分析 flag{w1reshARK_ez_1sntit} 3.[CISCN 2023 初赛]被加密的生产流量 c1f_fi1g_1000 4.[GKCTF 2021]签到 flag{Welc0me_GkC4F_m1siCCCCCC!} 5.[闽盾杯 2021]Modbus的秘密 flag{HeiDun_2021_JingSai} 6.[LitCTF 2023]easy_shark 7.[CISCN 2022 初赛]ez…

13、Kafka ------ kafka 消费者API用法(消费者消费消息代码演示)

目录 kafka 消费者API用法消费者API使用消费者API消费消息消费者消费消息的代码演示1、官方API示例2、创建消费者类3、演示消费结果1、演示消费者属于同一个消费者组2、演示消费者不属于同一个消费者组3、停止线程不适用4、一些参数解释 代码生产者&#xff1a;MessageProducer…

基于SpringBoot Vue医院门诊管理系统

大家好✌&#xff01;我是Dwzun。很高兴你能来阅读我&#xff0c;我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结&#xff0c;还为大家分享优质的实战项目&#xff0c;本人在Java项目开发领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#x…

Prometheus插件安装kafka_exporter

下载地址 https://github.com/danielqsj/kafka_exporter/releases 解压 tar -zxvf kafka_exporter-1.7.0.linux-amd64.tar.gzmv kafka_exporter-1.7.0.linux-amd64 kafka_exporter服务配置 cd /usr/lib/systemd/systemvi kafka_exporter.service内容如下 [Unit] Descript…

链路聚合原理与配置

链路聚合原理 随着网络规模不断扩大&#xff0c;用户对骨干链路的带宽和可靠性提出了越来越高的要求。在传统技术中&#xff0c;常用更换高速率的接口板或更换支持高速率接口板的设备的方式来增加带宽&#xff0c;但这种方案需要付出高额的费用&#xff0c;而且不够灵活。采用…