形态学操作之开操作与闭操作的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,一经查实,立即删除!

相关文章

基于PHP的学生管理系统

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

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

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

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

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

关节点检测

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

电脑通电自启动设置

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

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

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

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

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

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

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

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

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

项目学习记录

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

TCP和UDP相关问题(重点)——7.TCP的流量控制怎么实现的?

流量控制就是在双方通信时,发送方的速率和接收方的速率不一定是相等的,如果发送方发送的太快,接收方就只能把数据先放到接收缓冲区中,如果缓冲区都满了,那么处理不过来就只能丢弃,所以需要控制发送方的速率…

供应链|Managemeng Science 论文解读:数据驱动下联合定价和库存控制的近似方法 (一)

编者按 本次解读的文章发表于 Management Science,原文信息:Hanzhang Qin, David Simchi-Levi, Li Wang (2022) Data-Driven Approximation Schemes for Joint Pricing and Inventory Control Models. https://doi.org/10.1287/mnsc.2021.4212 文章在数…

测试管理_利用python连接禅道数据库并自动统计bug数据到钉钉群

测试管理_利用python连接禅道数据库并统计bug数据到钉钉 这篇不多赘述,直接上代码文件。 另文章基础参考博文:参考博文 加以我自己的需求优化而成。 统计的前提 以下代码统计的前提是禅道的提bug流程应规范化 bug未解决不删除bug未关闭不删除 db_…

闭区间上连续函数的性质【高数笔记】

1. 分几个性质 2. 每个性质的注意事项是什么 3. 每个性质适用什么类型的题型 4. 注意最值定理和正弦函数的不同 5. 做题步骤是什么

Web前端框架-Vue(初识)

文章目录 web前端三大主流框架**1.Angular****2.React****3.Vue**什么是Vue.js 为什么要学习流行框架框架和库和插件的区别一.简介指令v-cloakv-textv-htmlv-pre**v-once**v-onv-on事件函数中传入参数事件修饰符双向数据绑定v-model 按键修饰符自定义按键修饰符别名v-bind(属性…

Swift 使用 Combine 进行开发 从入门到精通七

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…

DMA直接内存访问,STM32实现高速数据传输使用配置

1、DMA运用场景 随着智能化、信息化的不断推进,嵌入式设备的数据处理量也呈现指数级增加,因此对于巨大的数据量处理的情况时,必须采取其它的方式去替CPU减负,以保证嵌入式设备性能。例如SD卡存储器和音视频、网络高速通信等其它情…

排序算法的时间复杂度存在下界问题

对于几种常用的排序算法,无论是归并排序、快速排序、以及更加常见的冒泡排序等,这些排序算法的时间复杂度都是大于等于O(n*lg(n))的,而这些排序算法存在一个共同的行为,那就是这些算法在对元素进行排序的时候,都会进行…

Visual Studio 2010+C#实现信源编码

1. 要求 本文设计了一套界面系统,该系统能够实现以下功能: 克劳夫特不等式的计算,并且能够根据计算结果给出相应的信息。可通过用户输入的初始条件然后给出哈夫曼编码以及LZ编码,结果均通过对话框来显示哈夫曼编码结果包含相应的…

Python小白:Python 编辑器那么多种,到底怎么选!!

前言 我在刚刚接触编程的时候很纠结于这个问题,因为我想找一个功能强大,免费,可多平台,支持多种语言的编辑器,所以我特意花费了一些时间对 Python 的编辑器进行了调研,我最终选择了 VScode 作为我的首选编…