OpenCVForUnity(十)扩张与侵蚀效果

文章目录

  • 前言
  • 扩张
    • 案例展示
  • 侵蚀
    • 案例展示
  • 结语:


前言

在这个教程中,您将学习两种常见的图像形态运算符:侵蚀和膨胀。为此,您将使用OpenCV库中的两个函数:erode 和 dilate。
形态操作是一组基于形状的图像处理操作。形态操作会将结构元素应用于输入图像,并生成输出图像。

其中最基本的形态操作是侵蚀和膨胀。它们具有广泛的应用,包括:
1.消除噪声。
2.分离图像中的单个元素并连接不同的元素。
3.查找图像中的凸点或孔洞。

我们将使用以下图像作为示例来简要解释侵蚀和膨胀操作:
在这里插入图片描述


扩张

在形态操作中,包括将图像与一个内核(B)进行卷积,该内核可以是任何形状或尺寸,通常是正方形或圆形。内核具有一个定义的锚点,通常位于内核的中心。

当内核在图像上移动时,我们计算内核与图像重叠部分的最大像素值,并用该最大值替换锚点位置的像素值。可以推断出,这种最大化的操作会使图像中的亮区域扩大(因此称为膨胀操作)。
以提供的图像为例,通过应用膨胀操作,我们可以得到以下结果:BB
在这里插入图片描述

在这个例子中,我们将使用一个倒置的原始图像来更好地理解概念,并避免可能的混淆。在这个倒置的图像中,白色的对象表示字母。

我们将对这个倒置的图像应用两次3x3大小的矩形结构元素的膨胀操作。
通过这两次膨胀操作,我们会观察到背景(即黑色区域)被扩大,而字母的白色区域则保持不变。这是因为膨胀操作会将结构元素放置在图像上,然后计算最大像素值,并用该值替换结构元素的中心像素。

因此,在这个例子中,这两次膨胀操作会扩大背景(即黑色地区),而字母的白色区域则保持不变。

在这里插入图片描述

案例展示

//图片读取
string readPath1 = Application.dataPath + "/OpenCVForUnity/Examples/Resources/flower.jpg";
Mat blurMat = Imgcodecs.imread(Utils.getFilePath(readPath1), Imgcodecs.IMREAD_COLOR);
//扩张效果处理
int dilationSize = 5;
Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(2 * dilationSize + 1, 2 * dilationSize + 1), new Point(dilationSize, dilationSize));
Imgproc.dilate(blurMat, blurMat, element);
//色彩模式转换
Imgproc.cvtColor(blurMat, blurMat, Imgproc.COLOR_BGR2RGB);
//展示图片
Texture2D blurTexture = new Texture2D(blurMat.cols(), blurMat.rows(), TextureFormat.RGB24, false);
Utils.matToTexture2D(blurMat, blurTexture);
GameObject.Find("Cube1").GetComponent<Renderer>().material.mainTexture = blurTexture;

以下左边是原图,右边是效果图:
在这里插入图片描述

首先是需要用Imgproc.getStructuringElement为函数构建指定形状和大小:
Imgproc.getStructuringElement(shape形状,ksize大小,anchor锚点)

  1. 矩形框:Imgproc.MORPH_RECT
  2. 十字架:Imgproc.MORPH_CROSS
  3. 椭圆:Imgproc.MORPH_ELLIPSE

侵蚀

侵蚀操作是膨胀操作的反向操作。它计算给定内核区域的局部最小值。
当侵蚀操作的内核在图像上扫描时,我们计算内核与图像重叠部分的最小像素值,并用该最小值替换锚点位置的图像像素值。
回到之前的膨胀的例子,我们现在将侵蚀操作应用于原始图像。结果如下,您可以看到图像的亮区域(背景)变得更窄,而暗区域(字母)变得更大。
在这里插入图片描述

根据您的要求,我们将对反转的原始图像应用两次具有3x3大小的矩形结构元素的侵蚀操作。请注意,在这个过程中,我们使用的是倒置的图像。
通过这两次侵蚀操作,我们可以观察到对象(即字母)变得更白。这是因为侵蚀操作计算内核区域的局部最小值,并用该最小值替换锚点位置的图像像素值。
在这里插入图片描述

所以,在这个例子中,这两次侵蚀操作使得图像中的对象(即字母)变得更白。

案例展示

//图片读取
string readPath1 = Application.dataPath + "/OpenCVForUnity/Examples/Resources/ZI.jpg";
Mat blurMat = Imgcodecs.imread(Utils.getFilePath(readPath1), Imgcodecs.IMREAD_COLOR);
//消融效果处理
int erosionSize = 1;
Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(2 * erosionSize + 1, 2 * erosionSize + 1), new Point(erosionSize, erosionSize));
Imgproc.erode(blurMat, blurMat, element);
//色彩模式转换
Imgproc.cvtColor(blurMat, blurMat, Imgproc.COLOR_BGR2RGB);
//图片展示
Texture2D blurTexture = new Texture2D(blurMat.cols(), blurMat.rows(), TextureFormat.RGB24, false);
Utils.matToTexture2D(blurMat, blurTexture);
GameObject.Find("Cube1").GetComponent<Renderer>().material.mainTexture = blurTexture;

以下左边是原图,右边是效果图:
在这里插入图片描述

结语:

扩张和侵蚀是一对非常有用的辅助效果,理解了他的工作原理和效果可以为图形进行进一步的加工和处理,以达到想要的效果。
好啦,这节的介绍就到这里,欢迎观看,可以的话顺手点个赞,谢谢。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电气防火限流式保护器在汽车充电桩使用上的作用

【摘要】 随着电动汽车行业的不断发展&#xff0c;电动汽车充电设施的使用会变得越来越频繁和广泛。根据中汽协数据显示&#xff0c;2022年上半年&#xff0c;我国新能源汽车产销分别完成266.1万辆和260万辆,同比均增长1.2倍,市场渗透率达21.6%。因此&#xff0c;电动汽车的安全…

【MySQL】数据库基本使用

文章目录 一、数据库介绍二、数据库使用2.1 登录MySQL2.2 基本使用2.2.1 显示当前 MySQL 实例中所有的数据库列表2.2.2 创建数据库2.2.3 创建数据库表2.2.4 在表中插入数据2.2.5 在表中查询数据 三、服务器、数据库、表之间的关系四、SQL语句分类五、存储引擎 一、数据库介绍 …

sql入门基础-2

Dml语句 对数据的增删改查 关键字 Insert增 Update删 Delete改 添加数据 给指定字段添加数据 Insert into 表明 (字段名1&#xff0c;字段名2) values&#xff08;值1&#xff0c;值2&#xff09;; 给全部字段添加数据--(根据位置对应添加到字段下) Insert into 表名 values…

套接字通信(C/C++ 多线程)----基于线程池的并发服务器

&#xff08;一&#xff09;大家可以看我写的这三篇&#xff0c;了解一下&#xff1a; 基于linux下的高并发服务器开发&#xff08;第四章&#xff09;- 多线程实现并发服务器_呵呵哒(&#xffe3;▽&#xffe3;)"的博客-CSDN博客https://blog.csdn.net/weixin_4198701…

【JavaWeb】Javascript经典案例

Javascript经典案例 注意&#xff1a;该文章是参考b站<20个JS经典案例>进行学习的&#xff0c;没有CSS的组成。 在慢慢更新中…哈哈哈哈&#xff0c;太慢了 文章目录 1.支付定时器2.验证码生成及校验 1.支付定时器 代码实现&#xff1a; confirm.html <!DOCTYPE html…

2.04 商品搜索功能实现

根据关键字获取分类查询对应的分页商品信息&#xff0c;并可以价格和销量进行排序切换 步骤1&#xff1a;mapper.xml编写sql语句 <!-- k: 默认&#xff0c;代表默认排序&#xff0c;根据name--> <!-- c: 根据销量排序--> <!-- p: 根据价格排序--> <sel…

消息队列 - 数据库操作

这里写自定义目录标题 前言数据表的插入删除操作关于实现接口类的几个注意实现实现封装创建DataBaseManager 类另一种获取Bean对象的方式 对数据库进行单元测试 前言 上一篇博客, 我们将消息队列的实体类创建完毕了, 并且还写了一些关于数据库的操作, 接下来我们继续进行关于数…

Java throw和throws 关键字

在Java中&#xff0c;异常可以分为两种类型&#xff1a; 未检查的异常&#xff1a;它们不是在编译时而是在运行时被检查&#xff0c;例如&#xff1a;ArithmeticException&#xff0c;NullPointerException&#xff0c;ArrayIndexOutOfBoundsException&#xff0c;Error类下的异…

wordpress 学习贴

安装问题 我的使用环境为docker环境&#xff0c;php、nginx、mysql分别处于3个容器中&#xff0c; 提示异常&#xff0c;打开debug模式&#xff0c;会发现 No such file or directory Warning: mysqli_real_connect(): (HY000/2002): No such file or directory 这个其实问题其…

Linux操作系统3-项目部署

手动部署 步骤 1.在idea中将文件项目进行打包 2.自定义一个文件目录&#xff0c;上传到Linux 3.使用 java -jar jar包名就可以进行运行 注意,如果需要启动该项目&#xff0c;需要确定所需的端口是否打开 采用这种方式&#xff0c;程序运行的时候会出现霸屏&#xff0c;并且会…

最近写了10篇Java技术博客【SQL和画图组件】

&#xff08;1&#xff09;Java获取SQL语句中的表名 &#xff08;2&#xff09;Java SQL 解析器实践 &#xff08;3&#xff09;Java SQL 格式化实践 &#xff08;4&#xff09;Java 画图 画图组件jgraphx项目整体介绍&#xff08;一&#xff09; 画图组件jgraphx项目导出…

计算机毕设 深度学习实现行人重识别 - python opencv yolo Reid

文章目录 0 前言1 课题背景2 效果展示3 行人检测4 行人重识别5 其他工具6 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉…

二阶段web基础与http协议

dns与域名 网络是基于tcp/ip协议进行通信和连接的 应用层-----传输层-----网络层-----数据链路层-----物理层 ip地址&#xff0c;每一台主机都有一个唯一的地址标识&#xff08;固定的ip地址&#xff09; 1.区分用户和计算机 2.通信 ip地址的问题在于32位二进制数组成的&…

【安装vue脚手架报错:npm install -g @vue-cli pm ERR! code EINVALIDTAGNAME 】

当我们执行npm install -g vue-cli时候会报错&#xff1a; npm ERR! Invalid tag name “vue-cli” of package “vue-cli”: Tags may not have any characters that encodeURIComponent encodes. npm ERR! A complete log of this run can be found in: /Users/wuwenlu/.npm/…

Centos虚拟机修改密码

1.重启系统 2.在这个选择界面&#xff0c;按e 3.找到如下位置&#xff0c;插入init/bin/sh 4.填写完成后按Ctrlx引导启动 5.输入mount -o remount, rw / (注意空格) 6.重置密码 出现以下为重置成功 7.执行touch /.autorelabel 8.退出exec /sbin/init 9.输入你的新密码…

React入门学习笔记1

前言 React是一个用来动态构0建用户界面的JavaScript库&#xff08;只关注于视图&#xff09;。它可以帮助开发人员轻松地创建复杂的交互式界面&#xff0c;以及管理与用户交互的状态。相比于其他的JavaScript框架&#xff0c;React采用了一种不同的编程模型&#xff0c;称为“…

【BASH】回顾与知识点梳理(二)

【BASH】回顾与知识点梳理 二 二. Shell 的变量功能2.1 什么是变量&#xff1f;2.2 变量的取用与设定: echo, 变量设定规则: set/unset2.3 环境变量的功能用 set 观察所有变量 (含环境变量与自定义变量)export&#xff1a; 自定义变量转成环境变量那如何将环境变量转成自定义变…

《向量数据库指南》——当前向量数据库的赛道有哪些?

当前&#xff0c;向量数据库赛道主要分为四个类别&#xff1a; 基于PG、Clickhouse 等进行魔改或者插件化实现的向量数据库&#xff1a;这类解决方案以现有的关系数据库或列存数据库作为基础&#xff0c;通过修改或插件扩展的方式添加向量搜索功能。PG Vector 是这类解决方案的…

【设计模式——学习笔记】23种设计模式——外观模式Facade(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入介绍基本介绍类图出场角色 案例实现案例一类图代码实现 案例二类图代码实现 外观模式在Mybatis源码中的应用总结文章说明 案例引入 在家庭影院中&#xff0c;要享受一场电影&#xff0c;需要如下步骤&#xff1a; 直接用遥控器&#xff1a;统筹各设备开关开…

Linux - 进程控制(进程替换)

0.引入 创建子进程的目的是什么&#xff1f; 就是为了让子进程帮我执行特定的任务 让子进程执行父进程的一部分代码 如果子进程想执行一个全新的程序代码呢&#xff1f; 那么就要使用 进程的程序替换 为什么要有程序替换&#xff1f; 也就是说子进程想执行一个全新的程序代码&a…