OpenCVForUnity(九)图片模糊

news2024/11/8 20:00:56

文章目录

  • 前言
  • 一、归一化框滤波器
      • 使用blur方法来实现
  • 二、高斯滤波器
      • 使用GaussianBlur方法实现
  • 三、中值滤波器
      • 使用medianBlur方法实现
  • 四、双边过滤器
      • 使用bilateralFilter方法实现
  • 结语


前言

本教程将介绍使用OpenCV中的多种线性滤波器来对图像进行平滑处理,主要包括以下几种:
blur:模糊滤镜
GaussianBlur:高斯模糊滤镜
medianBlur:中值滤波器
bilateralFilter:双边滤波器

平滑处理是常用的图像处理操作之一,能有效去除噪声影响。在本教程中,我们将介绍平滑处理的原理,并以减少噪声为例进行展示。另外,需要注意的是,下面的解释主要来源于计算机视觉领域的经典教材《Richard Szeliski》和《Learning OpenCV: Algorithms and Applications》。

为了进行平滑处理,我们需要对图像应用一种滤波器。滤波器是一种将输入像素值(i.e. f(i+k,j+l)) 加权求和后得到输出像素值(i.e. g(i,j))的数学运算。最常见的滤波器类型是线性的,即输出像素值是输入像素值的加权和:

在这里插入图片描述
这些系数也被称为内核(kernel),它们构成了滤波器的核心部分。我们可以将内核想象成一个系数窗口,在图像上滑动这个窗口进行卷积计算。实际应用中,常用的滤波器有很多种,我们将介绍最

一、归一化框滤波器

其中之一是归一化框滤波器,也被称为均值滤波器。这是最简单的滤波器之一,对于每个输出像素,它的值都是其相邻像素的平均值(每个像素的权重相等)。其内核可表示为以下矩阵:
在这里插入图片描述

使用blur方法来实现

结构
Imgproc.blur(源Mat, 目标Mat, 模糊大小);
例子:

//图片读取
string readPath1 = Application.dataPath + "/OpenCVForUnity/Examples/Resources/haizeiwang.png";
//放置图片
Mat blurMat = Imgcodecs.imread(Utils.getFilePath(readPath1), Imgcodecs.IMREAD_COLOR);
//模糊处理
Imgproc.blur(blurMat, blurMat,new Size(20,20));
//色彩模式转换
Imgproc.cvtColor(blurMat, blurMat, Imgproc.COLOR_BGR2RGB);
//结果放置在图片中
Texture2D blurTexture = new Texture2D(blurMat.cols(), blurMat.rows(), TextureFormat.RGBA32, false);
Utils.matToTexture2D(blurMat, blurTexture);
//展示在材质中
GameObject.Find("Cube1").GetComponent<Renderer>().material.mainTexture = blurTexture;

原图:
在这里插入图片描述
处理后:
在这里插入图片描述

二、高斯滤波器

高斯滤波器可能是最常用且最有用的滤波器之一(尽管不是最快的)。通过将输入图像中的每个像素与高斯核进行卷积并将卷积结果相加,就可以得到输出图像。它能够有效地平滑图像,并能够消除各种类型的噪声,例如高斯噪声。
对于一维的情况,可以发现位于中心的像素具有最大的权值,邻居的权值随着它们与中心像素之间的空间距离增加而减小。
需要注意的是,二维高斯核可以表示为以下形式:
在这里插入图片描述

其中,μ表示均值(即峰值),σ表示方差(对于每个变量x和y)。
2D数据公式可表示为:
在这里插入图片描述

使用GaussianBlur方法实现

结构:
Imgproc.GaussianBlur(源Mat, 目标Mat, 模糊大小(正奇数),X标准差, Y标准差,像素外推);
例子:

//图片读取
string readPath1 = Application.dataPath + "/OpenCVForUnity/Examples/Resources/haizeiwang.png";
//放置图片
Mat blurMat = Imgcodecs.imread(Utils.getFilePath(readPath1), Imgcodecs.IMREAD_COLOR);
//模糊处理
Imgproc.GaussianBlur(blurMat, blurMat, new Size(33, 33), 0, 0);
//色彩模式转换
Imgproc.cvtColor(blurMat, blurMat, Imgproc.COLOR_BGR2RGB);
//结果放置在图片中
Texture2D blurTexture = new Texture2D(blurMat.cols(), blurMat.rows(), TextureFormat.RGBA32, false);
Utils.matToTexture2D(blurMat, blurTexture);
//展示在材质中
GameObject.Find("Cube1").GetComponent<Renderer>().material.mainTexture = blurTexture;

在这里插入图片描述

三、中值滤波器

中值滤波器遍历信号的每个元素(在这种情况下为图像),并用其相邻像素的中位数(位于估计像素周围的正方形邻域)中替换每个像素。

使用medianBlur方法实现

结构:
Imgproc.medianBlur(源Mat, 目标Mat, 模糊大小(正奇数));
例子:

//图片读取
string readPath1 = Application.dataPath + "/OpenCVForUnity/Examples/Resources/haizeiwang.png";
//放置图片
Mat blurMat = Imgcodecs.imread(Utils.getFilePath(readPath1), Imgcodecs.IMREAD_COLOR);
//模糊处理
Imgproc.medianBlur(blurMat, blurMat, 33);
//色彩模式转换
Imgproc.cvtColor(blurMat, blurMat, Imgproc.COLOR_BGR2RGB);
//结果放置在图片中
Texture2D blurTexture = new Texture2D(blurMat.cols(), blurMat.rows(), TextureFormat.RGBA32, false);
Utils.matToTexture2D(blurMat, blurTexture);
//展示在材质中
GameObject.Find("Cube1").GetComponent<Renderer>().material.mainTexture = blurTexture;

在这里插入图片描述

四、双边过滤器

双边滤波器是一种可以消除噪声,同时保留边缘信息的滤波器。它类似于高斯滤波器,但它不仅考虑像素之间的空间距离,还考虑了它们的灰度值之间的差异。在计算每个像素与其相邻像素的权重时,双边滤波器使用两个分量:一个与高斯滤波器相同的空间权重,另一个则基于像素值之间的相似性权重。这两个分量都可以设置参数来调整其对输出图像的影响。
因为双边滤波器考虑了像素值之间的相似性,所以它可以保留边缘信息,而不像其他平滑滤波器(如高斯滤波器)会使边缘模糊。因此,双边滤波器在一些场景下比其他滤波器效果更好,例如图像去噪和图像增强。
需要注意的是,双边滤波器计算量相对较大,因此可能比其他滤波器更慢,但是可以通过调整参数来平衡计算量和滤波效果。

使用bilateralFilter方法实现

结构:
Imgproc.bilateralFilter(源Mat, 目标Mat, 每个像素邻域的直径, 像素邻域内影响颜色范围, 影响颜色距离);
例子

//图片读取
string readPath1 = Application.dataPath + "/OpenCVForUnity/Examples/Resources/haizeiwang.png";
//放置图片
Mat blurMat = Imgcodecs.imread(Utils.getFilePath(readPath1), Imgcodecs.IMREAD_COLOR);
//模糊处理
Imgproc.bilateralFilter(blurMat, blurMat, 15, 80, 80, Core.BORDER_DEFAULT);
//色彩模式转换
Imgproc.cvtColor(blurMat, blurMat, Imgproc.COLOR_BGR2RGB);
//结果放置在图片中
Texture2D blurTexture = new Texture2D(blurMat.cols(), blurMat.rows(), TextureFormat.RGBA32, false);
Utils.matToTexture2D(blurMat, blurTexture);
//展示在材质中
GameObject.Find("Cube1").GetComponent<Renderer>().material.mainTexture = blurTexture;

结语

虽然都是模糊效果,对比上面的效果图还是能发现有一定的区别,小伙伴们可以根据效果和性能的考虑。选择使用不同的滤波器,实现自己想要的效果喔。
那么本次分享就到这,可以的话顺手点个赞哈,谢谢观看。

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

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

相关文章

程序员面试IT技术岗的三大技巧

文章目录 技巧一&#xff1a;深入研究意向企业技巧二&#xff1a;准备常见的面试问题技巧三&#xff1a;总结经历的面试题 在找工作时&#xff0c;面试是每位程序员必须经历的一关。面对众多求职者竞争激烈的情况&#xff0c;我们需要结合自己的现状&#xff0c;针对意向企业做…

复习第三章反射+IO流

一、反射 JAVA反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意一个方法和属性&#xff1b;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机…

在使用Python爬虫时遇到503 Service Unavailable错误解决办法汇总

在进行Python爬虫的过程中&#xff0c;有时会遇到503 Service Unavailable错误&#xff0c;这意味着所请求的服务不可用&#xff0c;无法获取所需的数据。为了解决这个常见的问题&#xff0c;本文将提供一些解决办法&#xff0c;希望能提供实战价值&#xff0c;让爬虫任务顺利完…

机器人科普--AGILOX 叉车

机器人科普--AGILOX 叉车 1 概述2 导航3 驱动轮组4 叉举参考 1 概述 AGILOX 叉车&#xff0c;不需要画地图路径&#xff0c;很厉害。 2 导航 中间路径自由导航&#xff0c;末端规划出轨迹路线&#xff0c;并使用优良的控制器做轨迹追踪。 AGILOX &#xff5c; 10 Min setu…

mysql安装教程保姆级

MySQL免安装本地运行 1.下载MySQL2.创建install.bat3.init.sql 初始创建4.环境变量配置5.运行 install.bat 管理员权限运行6.连接成功遇到的问题 1.下载MySQL ①地址&#xff1a;https://downloads.mysql.com/archives/community/ ②解压 2.创建install.bat 放在mysql>b…

时序预测 | MATLAB实现GRNN广义回归神经网络时间序列预测(多指标,多图)

时序预测 | MATLAB实现GRNN广义回归神经网络时间序列预测(多指标,多图) 目录 时序预测 | MATLAB实现GRNN广义回归神经网络时间序列预测(多指标,多图)效果一览基本介绍程序设计参考资料效果一览 基本介绍 1.MATLAB实现GRNN广义回归神经网络时间序列预测(完整源码和数据) …

hive-date

current_date -- 获取当前系统时间 &#xff0c;获取到的是10 的系统时间 例如 &#xff1a; 2023-07-28 select current_date form edw.test;current_timestamp -- 获取当前的时间戳日期格式&#xff0c;例如 1957-07-27 13:31:21.641 会取到毫秒的一个时间戳格式 select *…

openvino批量推理资料汇总

1、开发者实战 | 基于 C# 和 OpenVINO™ 2023.0部署 YOLOv8 全系列模型_OpenVINO 中文社区的博客-CSDN博客 2、在英特尔 CPU 上加速 Stable Diffusion 推理_OpenVINO 中文社区的博客-CSDN博客 3、 5周年更新 | OpenVINO™ 2023.0&#xff0c;让AI部署和加速更容易_OpenVINO 中…

【C++】—— 多态的基本介绍

前言&#xff1a; 在之前的学习过程中&#xff0c;我们已经对继承进行了详细的学习和了解。今天&#xff0c;我将带领大家学习的是关于 多态 的基本知识。 目录 &#xff08;一&#xff09;多态的概念 1、概念 &#xff08;二&#xff09;多态的定义及实现 1、多态的构成条…

【力扣每日一题】2023.8.1 英雄的力量

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们一个数组&#xff0c;让我们找出数组的每个非空子数组&#xff08;不用连续&#xff09;&#xff0c;然后按照公式算出子数组的…

CNN、数据预处理、模型保存

目录 CNN代码读取数据搭建CNN训练网络模型 数据增强迁移学习图像识别策略数据读取定义数据预处理操作冻结resnet18的函数把模型输出层改成自己的设置哪些层需要训练设置优化器和损失函数训练开始训练再训练所有层关机了&#xff0c;再开机&#xff0c;加载训练好的模型 CNN 代码…

计算机网络(2) --- 网络套接字UDP

计算机网络&#xff08;1&#xff09; --- 网络介绍_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/131967378?spm1001.2014.3001.5501 目录 1.端口号 2.TCP与UDP协议 1.TCP协议介绍 1.TCP协议 2.UDP协议 3.理解 2.网络字节序 发送逻辑…

Node.js之express框架学习心得

Node.js:颠覆传统的服务器端开发 Node.js是基于Chrome V8引擎构建的JavaScript运行时,它采用了完全不同的开发模型。Node.js使用事件驱动和非阻塞I/O的方式处理请求,通过单线程和异步机制,实现高效的并发处理。这意味着在Node.js中,一个线程可以处理数千个并发连接,大大提…

Debian 12.1 “书虫 “发布,包含 89 个错误修复和 26 个安全更新

导读Debian 项目今天宣布&#xff0c;作为最新 Debian GNU/Linux 12 “书虫 “操作系统系列的首个 ISO 更新&#xff0c;Debian 12.1 正式发布并全面上市。 Debian 12.1 是在 Debian GNU/Linux 12 “书虫 “发布六周后推出的&#xff0c;目的是为那些希望在新硬件上部署操作系统…

从内核源码看 slab 内存池的创建初始化流程

slab cache 机制确实比较复杂&#xff0c;涉及到的场景又很多&#xff0c;大家读到这里&#xff0c;我想肯定会好奇或者怀疑笔者在上篇文章中所论述的那些原理的正确性&#xff0c;毕竟 talk is cheap &#xff0c;所以为了让大家看着安心&#xff0c;理解起来放心&#xff0c;…

让SpringBoot不需要Controller、Service、DAO、Mapper,卧槽!这款工具绝了!

Dataway介绍 Dataway 是基于 DataQL 服务聚合能力&#xff0c;为应用提供的一个接口配置工具。使得使用者无需开发任何代码就配置一个满足需求的接口。整个接口配置、测试、冒烟、发布。一站式都通过 Dataway 提供的 UI 界面完成。UI 会以 Jar 包方式提供并集成到应用中并和应…

在windows下安装ruby使用gem

在windows下安装ruby使用gem 1.下载安装ruby环境2.使用gem3.gem换源 1.下载安装ruby环境 ruby下载地址 选择合适的版本进行下载和安装&#xff1a; 在安装的时候&#xff0c;请勾选Add Ruby executables to your PATH这个选项&#xff0c;添加环境变量&#xff1a; 安装Ruby成…

vue-print-nb使用(实现分页打印)

参考链接&#xff1a;vue-print-nb - npm (npmjs.com)https://www.npmjs.com/package/vue-print-nb 一、安装 1、Vue2安装 npm install vue-print-nb --save <!-- 全局配置&#xff1a;main.js --> import Print from vue-print-nb // Global instruction Vue.use(P…

解码“平台工程”,VMware 有备而来

随着全球数字化进程加快&#xff0c;企业使用前沿技术加快商业创新&#xff0c;以提高竞争力。其中如何加快开发效率&#xff0c;为客户创造更多价值成为新的关注焦点。 继DevOps后&#xff0c;“平台工程”&#xff08;Platform Engineering&#xff09; 一词引发热议。平台工…