图像处理技巧形态学滤波之腐蚀操作

1. 引言

欢迎回来,我的图像处理爱好者们!今天,让我们深入研究图像处理领域中的形态学计算。这些非线性的图像处理技术允许我们操纵图像中对象的形状和结构。在本系列中,我们将依次介绍四种基本的形态学操作:腐蚀、膨胀、开操作和闭操作。

闲话少说,我们直接开始吧!

2. 腐蚀操作原理

腐蚀是常见的形态学操作之一,它通过从图像边界中去除像素来精细地缩小图像中的对象。具体而言,它通过考虑每个像素的邻域并将其值设置为该邻域中所有像素中的最小值来实现这一点。在二进制图像中,如果任何相邻像素的值为0,则输出像素也设置为0。

接着,让我们通过具体示例来进行讲解,首先导入我们今天的图像,代码如下:

# 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);

得到结果如下:
在这里插入图片描述
接下来是定义结构化元素,对于这个例子,让我们使用十字架作为我们的选择:

# 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);

得到结构化元素可视化效果如下:
在这里插入图片描述

3. 腐蚀操作效果

经过上述操作,我们定义了需要操作的原始图像和相应的结构化模板元素,接着我们使用函数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 on the original image with cross structuring element
apply_erosion(original_image, selem_cross)

得到结果如下:
在这里插入图片描述
观察上述输出,可以看到经过变换后的图对应的是原始图像的图的缩小版,这就是腐蚀操作的效果。大家可以通过下列动图进行更加详细的理解,样例图如下:

在这里插入图片描述

4. 其他效果

需要注意的是,腐蚀操作中使用的邻域大小或结构元素的选择会对结果产生不同的影响。我们可以通过选择不同的结构元素,如正方形、圆盘或自定义形状,以实现基于所需结果的特定腐蚀的效果。

例如,如果我选择使用一个正方形作为我的结构元素,代码如下:

# Define the structuring element 
selem_square = np.array([[0,0,0,0],[0,1,1,0],[0,1,1,0],[0,0,0,0]])# Apply erosion on the original image with square structuring element
apply_erosion(original_image, selem_square)

得到被侵蚀的图像将看起来像这样:在这里插入图片描述

5. 总结

腐蚀的主要目的是去除零散的早点和细线,从而只保留实质性的物体。在我们施加腐蚀操作后,剩余的线条看起来更加细,图像中对象的形状看起来更小。腐蚀蚀通常是对象分割和边界提取等任务中必备的基础操作。

您学废了嘛?

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka 概述

Kafka 为什么需要消息队列(MQ)使用消息队列的好处(1)解耦(2)可恢复性(3)缓冲(4)灵活性 & 峰值处理能力(5)异步通信 消息队列的两…

Neo4j笔记-数据迁移(导出/导入)

这里先说明以下几点: Neo4j在4.0下版本默认的库名是:graph.db Neo4j在4.0上版本默认的库名是:neo4j.db 不管是Neo4j,还是Neo4j Desktop,都会在bin目录下有neo4j、neo4j-admin软件。在conf目录下,有neo4j.…

MySQL SUBSTRING_INDEX() 函数的详细介绍

MySQL SUBSTRING_INDEX() 从给定字符串中返回指定数量的分隔符出现之前的子字符串。 当指定数字为正数时从最终分隔符的左侧返回子字符串,当指定数字为负数时从最终分隔符的右侧返回子字符串。 如果指定的次数大于分隔符的出现次数,则返回的子字符串将…

【每日一题】1572. 矩阵对角线元素的和

【每日一题】1572. 矩阵对角线元素的和 1572. 矩阵对角线元素的和题目描述解题思路 1572. 矩阵对角线元素的和 题目描述 给你一个正方形矩阵 mat,请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1&a…

pycharm的Terminal中如何设置打开anaconda3的虚拟环境

在pycharm的File -> Settings -> Tools -> Terminal下面,如下图所示 修改为红框中内容,然后关闭终端在重新打开终端,即可看到anaconda3的虚拟环境就已经会被更新

数学建模(一)前继概念

课程推荐:数学建模老哥_哔哩哔哩_bilibili 目录 一、什么是数学建模? 二、数学建模的一般步骤 三、数学建模赛题类型 1.预测型 2. 评价类 3.机理分析类 4. 优化类 一、什么是数学建模? 数学建模是利用数学方法解决实际问题的一种实践。…

《Linux从练气到飞升》No.12 Linux进程概念

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的…

maven 删除下载失败的包

本文介绍了当Maven包报红时,使用删除相关文件的方法来解决该问题。文章详细说明了_remote.repositories、.lastUpdated和_maven.repositories文件的作用,以及如何使用命令行删除这些文件。这些方法可以帮助开发者解决Maven包报红的问题,确保项…

css-4:元素水平垂直居中的方法有哪些?如果元素不定宽高呢?

1、背景 在开发中,经常遇到这个问题,即让某个元素的内容在水平和垂直方向上都居中,内容不仅限于文字,可能是图片或其他元素。 居中是一个非常基础但又是非常重要的应用场景,实现居中的方法存在很多,可以将这…

go语言从0基础到安全项目开发实战

一.环境搭建并helloworld 搭建环境比较简单 1.1安装SDK 到以下链接下 Go下载 - Go语言中文网 - Golang中文社区 下载windows版本64位zip包 https://studygolang.com/dl/golang/go1.20.7.windows-amd64.zip 1.2配置环境变量 不配置的话就只能在bin目录下才能运行go命令 …

[保研/考研机试] 猫狗收容所 C++实现

题目描述: 输入: 第一个是n,它代表操作序列的次数。接下来是n行,每行有两个值m和t,分别代表题目中操作的两个元素。 输出: 按顺序输出收养动物的序列,编号之间以空格间隔。 源代码&#xff…

RabbitMQ在CentOS下的安装

RabbitMQ的版本是3.8.2 1.环境配置:CentOs 7.6以上版本,我的版本是7.9,不要对yum换源,否则可能会安装失败。 echo "export LC_ALLen_US.UTF-8" >> /etc/profile source /etc/profile 以上命令,是…

ESP 32 蓝牙虚拟键盘链接笔记本电脑的键值问题

由于打算利用esp32 通过蓝牙链接电脑后实现一些特俗的键盘功能,所以就折腾了一下,折腾最耗费时间的却是键值问题,让一个20多年的老司机重新补充了知识 过程曲折就不说了,直接说结果。 我们通过网络搜索获取的键值和蓝牙模拟键盘传…

谷粒商城第十一天-完善商品分组(主要添上关联属性)

目录 一、总述 二、前端部分 2.1 改良前端获取分组列表接口及其调用 2.2 添加关联的一整套逻辑 三、后端部分 四、总结 一、总述 前端部分和之前的商品品牌添加分类差不多。 也是修改一下前端的分页获取列表的接口,还有就是加上关联的那一套逻辑,…

广州华锐互动:VR3D课程在线教育平台为职业院校提供沉浸式的虚拟现实学习体验

随着科技的飞速发展,虚拟现实(VR)和增强现实(AR)技术已经逐渐渗透到我们生活的各个领域。其中,VR3D课程在线教育平台作为一种新兴的教育方式,正在逐渐改变我们的学习方式和体验。本文将详细介绍VR3D课程在线教育平台的应用前景及特点。 VR3D课…

新一代构建工具 maven-mvnd

新一代构建工具 maven-mvnd mvnd的前世今生下载安装 mvndIDEA集成 mvnd的前世今生 maven 作为一代经典的构建工具,流行了很多年,知道现在依然是大部分Java项目的构建工具的首选;但随着项目复杂度提高,代码量及依赖库的增多使得ma…

使用 Python 和 Flask 构建简单的 Restful API 第 1 部分

一、说明 我将把这个系列分成 3 或 4 篇文章。在本系列的最后,您将了解使用flask构建 restful API 是多么容易。在本文中,我们将设置环境并创建将显示“Hello World”的终结点。 我假设你的电脑上安装了python 2.7和pip。我已经在python 2.7上测试了本文…

java 自定义xss校验注解实现

自定义一个注解Xss。名字随意 import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Targe…

AIGC技术揭秘:探索火热背后的原因与案例

文章目录 什么是AIGC技术?为何AIGC技术如此火热?1. 提高效率与创造力的完美结合2. 拓展应用领域,创造商业价值3. 推动技术创新和发展 AIGC技术案例解析1. 艺术创作:生成独特的艺术作品2. 内容创作:实时生成各类内容3. …

Ajax 笔记(四)—— Ajax 进阶

笔记目录 4. Ajax 进阶4.1 同步代码和异步代码4.2 回调函数地狱4.2.1 解决方法一:Promise 链式调用4.2.2 解决方法二:async 函数和 await 4.3 Promise.all 静态方法4.4 事件循环4.4.1 事件循环4.4.2 宏任务与微任务 4.5 案例4.5.1 案例一-商品分类4.5.2 …