形态学操作之开操作与闭操作的python实现——数字图像处理

原理

图像处理中的开操作(Opening)和闭操作(Closing)是形态学(Morphological)操作的两个基本类型,它们都是基于膨胀(Dilation)和腐蚀(Erosion)操作。这些操作通常用于二值化图像,但也可以应用于灰度图像。

腐蚀(Erosion)
腐蚀操作的目的是缩小或消除图像中的前景(通常是白色)对象。在腐蚀操作中,使用一个结构元素(或核)在图像上滑动。如果结构元素在某个位置下的所有像素都是前景像素,则保留该位置的中心像素;否则,该像素被消除(通常设置为背景色)。这导致对象边缘向内收缩或者较小的对象被完全消除。

腐蚀是一种缩小图像区域的操作,
其数学表达为:(A⊖B)={z∣B z​ ⊆A}
其中,A 是原始图像,B 是结构元素,z表示结构元素B中心在位置z的平移,⊖ 表示腐蚀操作。这个公式的含义是,只有当B完全位于A的内部时,A在z的位置才被保留。这通常导致图像中较小的物体消失,边界向内收缩。

膨胀(Dilation)
膨胀操作与腐蚀相反,其目的是扩大图像中的前景对象。使用相同的结构元素滑动操作,但只要结构元素下的任何一个像素是前景像素,就将该位置的中心像素设置为前景。这导致对象的边缘向外扩张。
膨胀是扩大图像区域的操作,
其数学表达为:
(A⊕B)={z∣(B z ∩A)=∅}
其中,A 是原始图像,B 是结构元素,B z表示结构元素B中心在位置z的平移,⊕ 表示膨胀操作。这意味着,只要
B与A在至少一个点上重叠,A在z的位置就被设置为前景。这通常导致边界向外扩张。

开操作(Opening)
开操作是先进行腐蚀后进行膨胀的操作。开操作可以去除小对象或细节(例如噪声),同时保持较大对象的大小和形状不变。因此,它通常用于去噪声和平滑对象的边界,同时不明显改变其面积。
开操作是腐蚀后紧随膨胀的过程,其数学表达为:
A∘B=(A⊖B)⊕B
开操作可以移除小的物体或细节(如噪声点),而不显著改变较大物体的大小。它在数学上表示为先对图像A应用结构元素B的腐蚀操作,然后对结果应用B的膨胀操作。

闭操作(Closing)
闭操作是先进行膨胀后进行腐蚀的操作。闭操作可以填充对象内部的小孔和断裂,同时基本保持对象的大小和形状。因此,它通常用于桥接邻近对象、填充小孔和缝隙,同时不显著改变对象的面积。
闭操作是膨胀后紧随腐蚀的过程,其数学表达为:
A∙B=(A⊕B)⊖B
闭操作可以填充小孔和断裂,而不显著改变较大物体的大小。它在数学上表示为先对图像A应用结构元素B的膨胀操作,然后对结果应用B的腐蚀操作。

应用
在实际应用中,开闭操作对于图像预处理非常有用,如在进行对象识别、特征提取前的噪声去除、边界平滑等。通过选择合适的结构元素和大小,可以对这些操作的效果进行精细控制。

开操作和闭操作的数学原理允许精确地控制图像中的结构,提供了一种强大的工具来增强图像、去除噪声、填充间断以及连接近邻物体。通过选择合适的结构元素(形状和大小),可以对这些操作的效果进行细致的调节,以满足特定的图像处理需求。

python实现下图

在这里插入图片描述
结果图显示了对指纹图像先进行开操作再进行闭操作的结果。所用结构元为3×3的方形结构元,开闭操作可以通过函数cv2.morphologyEx(img, op, kernel)实现,op取cv2.MORPH_OPEN和cv2.MORPH_CLOSE分别对应着开闭操作。

代码实现

import cv2
import numpy as np
from matplotlib import pyplot as pltimg = cv2.imread('Fig0911.tif')img_list = [img]
img_name_list = ['original']kernel = np.ones((3, 3), dtype=np.uint8)
img1 = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
img_list.append(img1)
img_name_list.append('open')img2 = cv2.morphologyEx(img1, cv2.MORPH_CLOSE, kernel)
img_list.append(img2)
img_name_list.append('close')_, axs = plt.subplots(1, 3)for i in range(3):axs[i].imshow(img_list[i], cmap='gray')axs[i].set_title(img_name_list[i])axs[i].axis('off')plt.show()

结果展示

在这里插入图片描述
在这里插入图片描述

开操作:先用B对A进行腐蚀得到AA,然后再用B对AA进行膨胀得到C。
先用B对A进行腐蚀,再用B对其结果进行膨胀,并不会得到原来的A,即膨胀与腐蚀并不像+和-一样是一对完全互补的操作。
作用:先用B对A进行腐蚀,将A中的小细节,小连通区域消除(注意这里是彻底消除),然后用B将A中没有被消除的地方恢复成原来的样子,最终只有被B完全消除掉的小细节没有了,A中其余的部分并没有改变。所以该操作被称为开操作(将两个藕断丝连的部分拉开)。

闭操作作用:先用B对A进行膨胀,将A的细节放大,将A中本不能够连接起来的地方连接起来,然后用B对结果进行腐蚀,将被放大的地方还原(注意,已经被连接起来的地方不会在被腐蚀抹掉)

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

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

相关文章

JAVA面试题11

什么是Java的访问修饰符,并列出它们的作用。 Java的访问修饰符包括public、private、protected和默认。它们的作用如下: public: 可以被任何其他类访问。 private: 只能被所在类访问,其他类无法访问。 protected: 可以被所在类和同一个包中的…

基于PHP的学生管理系统

前言 基于PHP的学生管理系统; 实现 登录、注册、学生信息、修改学生、删除学生、查询学生、添加学生等功能 ; 环境准备 开发平台:PhpStrom2022.1.2 、Phpstudy_pro 数据库:MySQL5.7.26 技术架构 Bootstrap PHP7.3.4html5css3 项目…

系统架构21 - 统一建模语言UML(下)

UML图 UML中的图分类作用 视图用例视图逻辑视图进程视图实现视图部署视图 UML中的图 “图”是一组元素的图形表示,大多数情况下把图画成顶点(代表事物)和弧(代表关系)的连通图。为了对系统进行可视化,可以…

Vue-60、Vue技术编程式路由

编程式路由导航 1、作用:不借助实现路由跳转,让路由跳转更加灵活 2、具体编码 pushShow(p){this.$router.push({name:xiangqing,query:{id:p.id,title:p.title}})},replaceShow(p){this.$router.replace({name:xiangqing,query:{id:p.id,title:p.titl…

运维高级篇-分库分表(拆分策略详解)

分库分表 介绍 问题分析 随着互联网及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行数据存 储,存在以下性能瓶颈: IO瓶颈:热点数据太多,数据库缓存不足,产生大量磁盘…

堆的数据结构以及堆的相应操作

堆的定义 二叉树中的堆使用顺序存储的结构来进行存储这里的堆指代的是一种数据结构 在一个关键码存在的集合中K {K1,K2,K3,....,Kn},把它的所有元素按照完全二叉树的顺序存储方式,存储在一个一维数组中,如果根结点的元素值大于其左右孩子的值&#xf…

关节点检测

https://www.bilibili.com/video/BV19g4y1777q/?p2&spm_id_frompageDriver 关节点检测全流程 YOLO:单阶段,快; MMPose:双阶段,准; 标注工具Labelme 用Labelme标注样本数据集

方格定位1_题解

【题解提供者】吴立强 解法 思路 将原数减 1 后看作是四进制数&#xff0c;那么十位代表的就是所在行号减 1 的值&#xff0c;个位代表的就是所在列号减 1 的值。 代码展示 #include <iostream> using namespace std;int main() {int n; cin >> n;int h (n …

MongoDB聚合: $sortByCount

$sortByCount聚合根据指定表达式的值对输入文档进行分组&#xff0c;然后计算每个不同分组中的文档数。 每个输出文档包含两个字段&#xff1a;一个是包含不同分组值的_id字段&#xff0c;另一个是包含属于该分组或类别的文档数量的计数字段。 文档按计数降序排序。 语法 {…

常用的文件系统、存储类型小整理

最近接触到了五花八门的文件系统、存储类型&#xff0c;名词听得头大&#xff0c;趁假期整理学习一番~ 名称OSSFastDFSJuiceFSCIFSCephFSEFSNFS全称Object Storage Service (对象存储服务)Fast Distributed File System (快速分布式文件系统)Juice File System (Juice 文件系统…

电脑通电自启动设置

首先要进入BIOS&#xff0c;以华硕为例&#xff0c;按下电源键&#xff0c;在开机之前按下delete键&#xff0c;其他电脑可能是esc或者某个f键&#xff0c;请自行查找。 进入BIOS后要找到电源管理&#xff0c;可以在高级选项中找一找&#xff0c;如上图右下角选择高级模式。 …

Golang 基础 环境配置和包管理

Golang 基础环境和语法 交叉编译 windows 下打包 linux 的运行程序。 设置变量 set GOARCHamd64 set GOOSlinuxgo build取消变量 set GOARCH set GOOS显示变量 set GOgo test 当go test以包列表模式运行时&#xff0c;go test会缓存成功的包的测试结果以避免不必要的重复…

PKI - 借助Nginx 实现Https 服务端单向认证、服务端客户端双向认证

文章目录 Openssl操系统默认的CA证书的公钥位置Nginx Https 自签证书Nginx Https 使用CA签发证书客户端使用自签证书供服务端验证客户端使用 根证书 签发客户端证书 供服务端验证 Openssl https://www.openssl.net.cn/ openssl是一个功能丰富且自包含的开源安全工具箱。 它提…

2024腾讯云游戏服务器租用多少钱一年?

2024年更新腾讯云游戏联机服务器配置价格表&#xff0c;可用于搭建幻兽帕鲁、雾锁王国等游戏服务器&#xff0c;游戏服务器配置可选4核16G12M、8核32G22M、4核32G10M、16核64G35M、4核16G14M等配置&#xff0c;可以选择轻量应用服务器和云服务器CVM内存型MA3或标准型SA2实例&am…

(44)公因子的数目

文章目录 每日一言题目解题思路法一:法二&#xff1a; 代码法一:法二&#xff1a; 结语 每日一言 懒惰行动得如此缓慢&#xff0c;贫穷很快就能超过它。——富兰克林 题目 题目链接&#xff1a;公因子的数目 给你两个正整数 a 和 b &#xff0c;返回 a 和 b 的 公 因子的数目…

在centos7中利用pybind11构建C++的动态库供python调用

在centos7中利用pybind11构建C的动态库供python调用 步骤 1&#xff1a;安装依赖步骤 2&#xff1a;获取 pybind11 头文件步骤 3&#xff1a;编写绑定代码步骤 4&#xff1a;编译动态库步骤 5&#xff1a;在 Python 中调用编译命令解释注意 需求&#xff1a;在 CentOS 7 中&…

Python - 构建多语言情感分析应用

在开发使用 Flask 构建的 Web 应用时,有时需要处理不同语言的情感分析。这个示例将展示如何同时处理英文和中文文本的情感分析,并使用 TextBlob 和 SnowNLP 这两个库实现。 英文情感分析 首先,我们有一个名为 __init__.py 的 Flask 应用处理英文情感分析。它接收 POST 请求…

画出TCP三次握手和四次挥手的示意图,并且总结TCP和UDP的区别

三次握手 第一次握手&#xff1a;客户端发送SYN包&#xff08;SYN1, seq0&#xff09;给服务器&#xff0c;并进入SYN_SENT状态&#xff0c;等待服务器返回确认包。第二次握手&#xff1a;服务器接收到SYN包&#xff0c;确认客户端的SYN&#xff0c;发送ACK包&#xff08;ACK1 …

在虚拟机上搭建CentOS环境并配置静态IP

在虚拟机上搭建CentOS环境并配置静态IP 在进行Linux系统的学习和实践时&#xff0c;搭建一个本地的CentOS环境是一个非常好的方式。本文将介绍如何使用虚拟机&#xff08;VM&#xff09;搭建CentOS环境&#xff0c;并配置静态IP&#xff0c;以便更好地进行网络管理和测试。 步…

项目学习记录

项目开发 创建项目环境配置关联git新增模块项目启动打印地址日志使用httpclient进行idea内部控制台测试使用AOP拦截器打印日志 创建项目 创建一个空项目&#xff0c;并勾选下面选项 然后进入pom.xml中修改项目配置 根据这个链接选则&#xff0c;修改项目的支持版本 链接&#…