图像处理技巧形态学滤波之膨胀操作
1. 引言
欢迎回来,我的图像处理爱好者们!今天,让我们继续研究图像处理领域中的形态学计算。在本篇中,我们将重点介绍腐蚀操作的反向效果膨胀操作。
闲话少说,我们直接开始吧!
2. 膨胀操作原理
膨胀操作为腐蚀操作的作用相反,这是图像处理中最常使用的另一种形态学操作,它主要通过在图像边界上扩展像素来实现扩宽图像中对象的作用。膨胀操作通过考虑每个像素的邻域并将其值设置为该邻域中所有像素中的最大值来实现的。对于二值图像,如果任何相邻像素的值为1,则输出像素也被设置为1。
接着,让我们通过具体示例来进行讲解,首先导入我们今天的图像,代码如下:
# Define the image
original_image = np.array([[0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 1, 1, 1, 0, 0],[0, 0, 1, 1, 1, 1, 0, 0],[0, 1, 1, 1, 1, 0, 0, 0],[0, 1, 1, 1, 0, 0, 0, 0],[0, 1, 1, 1, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0]])plt.figure(figsize=(10,10))
plt.imshow(original_image, cmap='gray', extent=[0, 8, 0, 8])
plt.title('Original Image', fontsize=20);
得到结果如下:

3. 定义结构化元素
和上一节腐蚀操作类似,我们选择同样的十字架结构化元素模板,代码如下:
# Define the structuring element
selem_cross = np.array([[0,1,0],[1,1,1],[0,1,0]])
plt.figure(figsize=(9,9))
plt.imshow(selem_cross, cmap='gray')
plt.title('Structuring Element: Cross', fontsize=20);
得到结果如下:

4. 膨胀操作效果
经过上述操作,我们定义了需要操作的原始图像和相应的结构化模板元素,接着我们使用函数apply_erosion来将上述结构化模板元素作用于相应的图像中,进而得到我们膨胀操作的效果,代码如下:
def apply_erosion(image, selem):# Perform erosion on the given image using the structuring element, selemeroded_image = erosion(image, selem)# Display the original and eroded imagesfig, axes = plt.subplots(1, 3, figsize=(15, 10))ax = axes.ravel()ax[0].imshow(selem, cmap='gray', extent=[0, selem.shape[1], 0, selem.shape[0]])ax[0].set_title('Structuring Element', fontsize=20)ax[1].imshow(image, cmap='gray', extent=[0, image.shape[1], 0, image.shape[0]])ax[1].set_title('Original Image', fontsize=20)ax[2].imshow(eroded_image, cmap='gray', extent=[0, image.shape[1], 0, image.shape[0]])ax[2].set_title('Eroded Image', fontsize=20)plt.tight_layout()plt.show()apply_erosion(original_image, selem_cross)
最终膨胀操作的效果如下:

观察上述输出,可以看到经过膨胀操作后的图相比原始图像的扩大版。大家可以通过下列动图进行更加详细的理解,样例图如下:

5. 其他效果
需要注意的是,和腐蚀操作类似,膨胀操作中使用的邻域大小或结构元素的选择会对结果产生不同的影响。
这里,如果选择使用上一篇节中得正方形作为测试结构元素,相应得效果如下:

6. 总结
本文重点介绍了和腐蚀操作相反作用得膨胀操作,并通过具体例子进行了原理讲解,同时给出了相应得代码示例。
您学废了嘛?
相关文章:
图像处理技巧形态学滤波之膨胀操作
1. 引言 欢迎回来,我的图像处理爱好者们!今天,让我们继续研究图像处理领域中的形态学计算。在本篇中,我们将重点介绍腐蚀操作的反向效果膨胀操作。 闲话少说,我们直接开始吧! 2. 膨胀操作原理 膨胀操作…...
机器学习基础之《特征工程(4)—特征降维》
一、什么是特征降维 降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程 1、降维 降低维度 ndarry 维数:嵌套的层数 0维:标量,具体的数0 1 2 3... …...
学生管理系统(Python版本)
class Student:def __init__(self, id, name, age):self.id idself.name nameself.age ageclass StudentManagementSystem:def __init__(self):self.students []def add_student(self, student):self.students.append(student)print("学生信息添加成功!&qu…...
Linux下快速创建大文件的4种方法总结
1、使用 dd 命令创建大文件 dd 命令用于复制和转换文件,它最常见的用途是创建实时 Linux USB。dd 命令是实际写入硬盘,文件产生的速度取决于硬盘的读写速度,根据文件的大小,该命令将需要一些时间才能完成。 假设我们要创建一个名…...
用 Rufus 制作 Ubuntu 系统启动盘时,选择分区类型为MBR还是GPT?
当使用 Rufus 制作 Ubuntu 系统启动盘时,您可以根据您的需求选择分区类型,MBR(Master Boot Record)还是 GPT(GUID Partition Table)。 MBR 是传统的分区表格式,适用于大多数旧版本的操作系统和旧…...
Nodejs+vue+elementui汽车租赁管理系统_1ma2x
语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode 前端nodejsvueelementui, 课题主要分为三大模块:即管理员模块、用户模块和普通管理员模块,主要功能包括&#…...
Prometheus入门
Prometheus(普罗米修斯) 是一种 新型监控告警工具,Kubernetes 的流行带动了 Prometheus 的应用。 全文参考自 prometheus 学习笔记(1)-mac 单机版环境搭建[1] Mac 上安装 Prometheus brew install prometheus 安装路径在 /usr/local/Cellar/prometheus/2.20.1, 配置文件在 /usr…...
RISC-V云测平台:Compiling The Fedora Linux Kernel Natively on RISC-V
注释:编译Fedora,HS-2 64核RISC-V服务器比Ryzen5700x快两倍! --- 以下是blog 正文 --- # Compiling The Fedora Linux Kernel Natively on RISC-V ## Fedora RISC-V Support There is ongoing work to Fedora to support RISC-V hardwar…...
Vim学习(三)—— Git Repo Gerrit
Git、Gerrit、Repo三者的概念及使用 三者各自作用: git:版本管理库,在git库中没有中心服务器的概念,真正的分布式。 repo:repo就是多个git库的管理工具。如果是多个git库同时管理,可以使用repo。当然使用…...
论坛项目之用户部分
注册接口 实现思路 1.特殊字段检查(比如性别没有给出需要给出默认值) 2.对比检查两次输入的密码是否一致,不一致报错 3.利用UUID生成随机‘盐’值,并使用密码进行MD5加密后与‘盐’进行拼接,生成加密后的密码 4.创建U…...
golang内存对齐
为什么要内存对齐? CPU访问内存时,以CPU的位数为单位进行访问。 如果访问未对齐的内存,处理器需要做两次内存访问,对齐的内存的访问可能仅需要一次,利用内存对齐后提升读取速度。 golang结构体内存对齐规则 在代码编译…...
【CheatSheet】Python、R、Julia数据科学编程极简入门
《Python、R、Julia数据科学编程极简入门》PDF版,是我和小伙伴一起整理的备忘清单,帮助大家10分钟快速入门数据科学编程。 另外,最近 TIOBE 公布了 2023 年 8 月的编程语言排行榜。 Julia 在本月榜单中实现历史性突破,成功跻身 …...
【golang】怎样判断一个变量的类型?
怎样判断一个变量的类型? package mainimport "fmt"var container []string{"zero", "one", "two"} func main() {container : map[int]string{0: "zero", 1: "one", 2: "two"}fmt.Printf…...
怎么学习AJAX相关技术? - 易智编译EaseEditing
学习AJAX(Asynchronous JavaScript and XML)相关技术可以让你实现网页的异步数据交互,提升用户体验。以下是一些学习AJAX技术的步骤和资源: HTML、CSS和JavaScript基础: 首先,确保你已经掌握了基本的HTML…...
JDK、JRE、JVM:揭秘Java的关键三者关系
文章目录 JDK:Java开发工具包JRE:Java运行环境JVM:Java虚拟机关系概述 案例示例:Hello World结语 在Java世界中,你可能经常听到JDK、JRE和JVM这几个概念,它们分别代表了Java开发工具包、Java运行环境和Java…...
【reactNative混合安卓开发~使用问题持续更】
reactNative混合安卓开发 reactNative开发移动端reactNative界面开发前端init.bat文件部分组件第三方组件解析1、定义theme主题shopify/restyle;菜单导航react-navigation/drawer、react-navigation/native; RN问题记录1、使用theme.js写的公共组件报错&…...
OCR的发明人是谁?
OCR的发明背景可以追溯到早期计算机科学和图像处理的研究。随着计算机技术的不断发展,人们开始探索如何将印刷体文字转换为机器可读的文本。 OCR(Optical Character Recognition,光学字符识别)的发明涉及多个人的贡献,…...
笔记本电脑连上WiFi之后的IP为什么会变?如何让它不变固定住?
笔记本连上WiFi后获取IP地址的过程,通常是通过DHCP (动态主机配置协议) 来完成的。默认情况下,DHCP会根据连接设备和网络状态动态地分配IP地址,因此你会看到IP地址可能经常改变。 如果你希望电脑的IP地址固定,可以尝试设置静态IP…...
【数学建模】--因子分析模型
因子分析有斯皮尔曼在1904年首次提出,其在某种程度上可以被看成时主成分分析的推广和扩展。 因子分析法通过研究变量间的相关稀疏矩阵,把这些变量间错综复杂的关系归结成少数几个综合因子,由于归结出的因子个数少于原始变量的个数,…...
RAM不够?CUBEIDE使用CCMRAM
RAM不够?使用CCMRAM 文章目录 RAM不够?使用CCMRAM打开连接LD文件:添加代码添加标识宏使用 打开连接LD文件: 添加代码 在SECTIONS段最后加上下面代码: _siccmram LOADADDR(.ccmram); /* CCM-RAM section * * IMPORTAN…...
从‘压缩壳’到‘保护壳’:聊聊UPX在软件安全中的双刃剑效应与真实案例
从‘压缩壳’到‘保护壳’:UPX在软件安全中的双刃剑效应深度解析 在软件安全领域,UPX(Ultimate Packer for eXecutables)一直是个充满争议的存在。这款开源压缩工具本意是减少可执行文件体积,却意外成为安全攻防战中的…...
别再纠结了!FLUENT两相流VOF、Mixture、Eulerian模型到底怎么选?附实战场景对比
FLUENT两相流模型实战指南:VOF、Mixture与Eulerian的精准选择策略 在计算流体动力学(CFD)领域,两相流问题一直是工程师们面临的重要挑战。无论是化工反应器中的气液混合,还是石油管道中的油水分离,亦或是能…...
告别ViT的‘算力焦虑’:手把手带你用Swin Transformer搞定图像分类(附PyTorch实战代码)
突破视觉Transformer算力瓶颈:Swin Transformer实战图像分类指南 在计算机视觉领域,Transformer架构正掀起一场革命。但当我们兴奋地将Vision Transformer(ViT)应用到实际项目中时,往往会遇到一个残酷的现实——显存爆…...
从一次vSAN报警深入:图解vSAN对象状态机,帮你彻底看懂‘正常’、‘降级’与‘不可访问’
深入解析vSAN对象状态机:从报警诊断到运维实战 那天凌晨三点,值班手机突然响起刺耳的警报声。监控系统显示某金融客户的核心交易集群出现"未知对象类型不可访问"的vSAN报警。作为经历过多次vSAN故障的老兵,我深知这种报警背后可能隐…...
S32K开发环境全攻略:基于S32 Design Studio和SDK的快速上手教程(含Arduino评估板)
S32K开发环境实战指南:从零构建智能车控系统 第一次拿到S32K开发板时,我盯着那排Arduino兼容的接口发呆了十分钟——这个汽车级MCU竟然能用面包板快速验证创意。NXP官方提供的工具链比想象中友好得多,但隐藏的坑也不少。本文将带你用S32 Desi…...
我的模型总在测试集翻车?可能是数据增强的‘姿势’不对!聊聊那些年我们踩过的坑
模型测试集翻车?数据增强的六大陷阱与实战解决方案 当你满怀期待地将精心调参的模型投入测试集,却发现性能断崖式下跌——这种挫败感每个算法工程师都深有体会。上周团队里一位资深研究员盯着0.23的测试F1分数苦笑:"训练集明明98%准确率…...
【Java 25虚拟线程高并发实战白皮书】:20年架构师亲授生产环境落地避坑指南(含压测对比数据)
第一章:Java 25虚拟线程演进脉络与高并发范式跃迁Java 虚拟线程(Virtual Threads)自 JDK 21 作为正式特性引入,至 JDK 25 已完成从实验性支持到生产就绪的深度演进。其核心驱动力在于解耦操作系统线程资源与应用级并发逻辑&#x…...
Microsoft Agent Framework 创建智能体
Microsoft Agent Framework 创建智能体 摘要 MAF (Microsoft Agent Framework) 是微软用于构建 AI 智能体 (Agent) 的开发框架;Microsoft Foundry 是基于 Azure 的企业级 AI 开发与运营平台。两者紧密配合:MAF 负责开发智能体逻辑,Foundry 负…...
zabbixwatch 安装部署
目录 环境要求 一、新系统搭建 1. 安装 Docker 环境 2. 下载项目文件 3. 启动服务 5. 配置数据源 二、系统卸载 完全卸载(删除所有数据) 仅停止服务(保留数据) 该插件可与zabbix进行数据连通,形成对应的数据大…...
华为防火墙双活链路部署避坑指南:IP-LINK和BFD到底该怎么选?
华为防火墙双活链路部署实战:IP-LINK与BFD技术选型深度解析 当企业网络架构面临双活链路部署时,华为防火墙的链路检测机制选择往往成为关键决策点。作为网络架构师,我们常常需要在IP-LINK和BFD两种主流方案间做出权衡——这不仅关乎网络稳定性…...
