机器视觉技术与应用实战(Chapter Two-04)

2.6 图像形态学及常见的图像处理工具

图像形态学:是分析几何形状和结构的数字方法,是建立在集合代数的基础上用集合论方法定量描述几何结构的学科。基本的图像形态学算法有:腐蚀(Erode)、膨胀(Dilate)、开(Open)、闭(Close)、细化(Thinning)。(最好要记下这几个单词,图像处理时常以英文形式出现)

接下来就了解一下这些算法,它们的处理对象一般是二值图像,二值图像里面,白色为1,黑色为0。

我们先不直接讲,先看几张图,会有深刻的印象的,嘻嘻~

就拿这个“人”字了。

原图(有水印,请直接忽略):

开启神器visionpro,用一个CogIPOneimage工具进行简单的膨胀和腐蚀。

为了体现效果,我没用3X3的结构元素,不过这个不重要,我们直接看结果:

腐蚀:膨胀:

看到这里,你可能觉得,哦,腐蚀就是缩小嘛,膨胀就是变大嘛,撒撒水啦~

我想让你再看一组图片

原图(背景白色,为了效果,截图我截大了一些):

腐蚀:膨胀:

我们就直接说区别吧,同一个工具在两张灰度反转的图像似乎会因为灰度(亮度)的不同,展示出不同的效果,下面我们就开始研究腐蚀和膨胀,它们的原理就是和图像的灰度有关哦!

对了,这两张图片我是用matlab进行反转的,代码如下:

I=imread('02.png');
J=imadjust(I,[0,1],[1,0]);
imwrite(J,'image2.jpg');

我还是想强调一下:不要直接用matlab里面的保存图片,这样会导致图片这样(分辨率不对):

imwrite保存的图像是和原来一致的:

---------------------------------------------------------------------------------------------------------------------------------

腐蚀和膨胀

腐蚀和膨胀在中文词义上就是相反的,其实在这里也是的哦。腐蚀是减少图像中目标边界的像素膨胀是在增加图像中目标边界周围像素

在腐蚀和膨胀的处理过程中,需要一个结构元素(也叫内核)对图像进行处理,结构元素是一个由0或1值组成的矩阵,每一个结构元素有一个原点(也叫锚点)结构元素中的原点指定待处理像素的位置,结构元素形状可以是任意形状注意了,这个结构元素的定义非常重要

腐蚀处理流程:进行腐蚀操作时,将结构元素划过图像,将结构元素覆盖区域的最灰度值提取,并代替原点位置的灰度值。

膨胀处理流程:进行腐蚀操作时,将结构元素划过图像,将结构元素覆盖区域的最灰度值提取,并代替原点位置的灰度值。

举个膨胀和腐蚀的栗子:

我的结构元素是这个(一般设中心为原点,如果有其他情况,具体情况具体分析),深蓝色部分为1,其他颜色为0

处理图像是这个:

结构元素就是这么划的,原点一行行遍历这张图像,将结构元素覆盖区域的最灰度值提取,并代替原点位置的灰度值

最后得到的膨胀后的图像是这样的,绿色部分为膨胀增加的部分像素点

同理可以获得腐蚀后的图像,绿色部分为腐蚀缩小的像素点:

原理其实非常简单理解,如果你还没理解,我的建议是不妨再看一遍结构元素的定义和处理流程,然后在纸上手动模拟一遍。腐蚀和膨胀的处理过程是一样的 ,主要区别在于灰度值取大小区别。

哟西,我们可以回到最初的起点了,为什么会出现之前“人”字那种不同效果的情况呢?

答案就非常明确了,膨胀是取的最大灰度值的点,也就是亮点,腐蚀是取的最小灰度值的点,也就是暗点!腐蚀对于亮图部分是缩小的,膨胀对于亮图的部分是放大的,友友们可以去看看那几张“人”字。

最后就是腐蚀和膨胀的作用了。

腐蚀的作用是:缩小处理,减少区域像素,边缘连接断开。

膨胀的作用是:扩大处理,增加区域像素,建立边缘连接。

最后,任何事情的最佳理解是建立在实践后的基础上的,我们可能耳熟能详的说出腐蚀和膨胀,意味着缩小和扩大,但我们需要思考在什么情况下会有什么情况出现,涉及了什么处理流程等等。

最后的最后,发展是前进上升的运动,我们一直在前进的路上,互相勉励!欢迎各位佬对文章的错误进行指点和批评!

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

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

相关文章

geemap学习笔记028:Landsat8计算时间序列NDVI并导出

前言 本节则是以Landsat8影像数据为例,进行NDVI时间序列计算,并将得到的时间序列NDVI进行展示并导出。 1 导入库并显示地图 import ee import geemap import datetime import pandas as pd import os ee.Initialize()2 定义时间范围 # 定义日期范围 …

【ECMAScript笔记四】自定义对象(创建,遍历)、内置对象(Math、Data、Array、String)、数据类型比较

文章目录 10 自定义对象10.1 创建对象方式10.1.1 字面量10.1.2 new object10.1.3 构造函数 10.2 遍历对象 11 内置对象11.1 Math 数学对象11.2 Date 时间对象11.3 Array 数组对象11.4 String 字符串对象 12 简单数据类型和复杂数据类型 10 自定义对象 JavaScript中的对象分为3…

频谱论文:基于张量Tucker分解的频谱地图构建算法

#频谱# [1]陈智博,胡景明,张邦宁 郭道省.(2023).基于张量Tucker分解的频谱地图构建算法.电子与信息学报(11),4161-4169. (陆军工程大学) 研究内容 将动态电磁环境的时变频谱地图建模为3维频谱张量,通过张量Tucker分解提取出具有物理意义的核…

使用级联毫米波传感器的成像雷达参考设计2(TI文档)

3.4 级联雷达信号处理链 3.4.1 MIMO雷达信号处理链 以MIMO模式收集的原始信号按照图16所示的流程进行处理。 图16 MIMO信号处理链 3.4.1.1 ADC数据读取和校准 每次数据采集后,将保存4个级联设备对应的二进制数据文件和相应的chirp配置文件。这两个文件是ADC数据读…

Zabbix+Grafana

背景 对指标采集 将采集的信息存储 可视化 报警 因为节点上本身就是zabbix,但对应的server在数据中心,不知道一个agent可否服务于多个server端,而且不确定数据中心是否会提供用户。所以还是放弃zabbix 架构

干货下载丨不分业态、不关注核心需求,怎么做得好项目管理?!

项目管理:装备制造业的破局利刃 对于装备制造行业而言,每一笔订单都是非标定制、小批量制造。这种特性决定了其行业企业普遍存在新品开发周期长、生产效率低、质量不稳定、交货期不稳定、成本预算难控制、非标品报价慢等问题。 如何提升企业的管理水平…

回溯算法去重的两种写法

回溯算法去重的两种写法 关于回溯,无论是排列、组合、子集,都会涉及到两个问题,一个是去重,另一个则是剪枝; 去重通常有几种方法。 以这道题来做验证。 90.子集II 力扣题目链接(opens new window) 给定一个可能包…

【数据结构】树状数组总结

知识概览 树状数组有两个作用: 快速求前缀和 时间复杂度O(log(n))修改某一个数 时间复杂度O(log(n)) 例题展示 1. 单点修改,区间查询 题目链接 活动 - AcWing本活动组织刷《算法竞赛进阶指南》,系统学习各种编程算法。主要面向…

JavaSE第7篇:封装

文章目录 前言一、封装1、好处:2、使用 二、四种权限修饰符三、构造器1、作用2、说明3、属性赋值的过程 四 、JavaBean的使用五、UML类图六 、Java关键字1、this说明2 、this可以用来修饰属性、方法3、 this调用构造器 前言 不管学什么都可以按3w: what? why? how?&#xf…

AttributeError: module ‘jax‘ has no attribute ‘Array‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

NET模式和桥接模式简要概述

NET模式 NAT是Network Address Translation的缩写,即网络地址转换。NAT模式也是VMware创建虚拟机的默认网络连接模式。在NAT模式中,让虚拟机借助NAT功能,通过宿主机器所在的网络来访问公网。这里的宿主机相当于有两个网卡,一个是…

【FPGA】电梯楼层显示(简易)

前言 这是作者室友的项目,本来不管作者事儿的,但是后来听到说是室友去网上找人花了80块买了个劣质的,不仅是从CSDN上抄的,而且使用的板子还不符合室友的要求。可叹作者心软啊,顺便给室友做了。 在代码实现部分会给出设…

【学习笔记】V8垃圾回收策略

V8 V8是一款主流的JavaScript执行引擎V8采用即时编译,速度比较快V8内存设限,64位操作系统中上限为1.5G,32位系统中不超过800M V8垃圾回收策略 采用分代回收的思想内存分为新生代\老生代针对不同对象采用不同算法 v8常用的GC算法: 分代回收、空间复制、标记清除、标记整理、…

RDD编程

目录 一、RDD编程基础 (一)RDD创建 (二)RDD操作 1、转换操作 2、行动操作 3、惰性机制 (三)持久化 (四)分区 (五)一个综合实例 二、键值对RDD &am…

系列九、事务

一、事务 1.1、概述 事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或者撤销操作请求,即:这些操作要么同时成功,要么同时失败。 例如: 张三给李四转账1000块钱&…

C语言短路操作

C语言短路操作 目录 一. 概述二. 例题 一. 概述 C语言中常用的短路操作符有两个,即逻辑与(&&)和逻辑或(||)。   对于逻辑与(&&)操作符&…

TCP/IP详解——FTP 协议,Telnet协议

文章目录 1. FTP 协议1.1 FTP的应用1.2 FTP传输文件的过程1.3 FTP传输模式1.4 主动模式(Active Mode)1.5 Active Mode 抓包分析1.6 被动模式(Passive Mode)1.7 Passive Mode 抓包分析 2. Telnet 协议2.1 Telnet 概念2.2 Telnet 协…

Golang清晰代码指南

发挥易读和易维护软件的好处 - 第一部分 嗨,开发者们,清晰的代码是指编写易于阅读、理解和维护的软件代码。它是遵循一组原则和实践,优先考虑清晰性、简单性和一致性的代码。清晰的代码旨在使代码库更易管理,减少引入错误的可能性…

python读取excel数据 附实战代码

在Python中,可以使用pandas库来读取Excel文件中的数据。下面是一个简单的例子: import pandas as pd# 读取Excel文件 df pd.read_excel(example.xlsx)# 显示前5行数据 print(df.head())在上面的代码中,我们首先导入了pandas库,并…

C/C++常见面试知识总结(三)

C语言是一种通用计算机(高级)编程语言;面向过程;广泛应用于计算机系统设计以及应用程序编写;设计目标,是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行…