形态学操作之开操作与闭操作的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.hqwc.cn/news/457987.html

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

相关文章

ideal打包,如何访问项目根目录的libs中的jar包

参考&#xff1a;idea maven 导入lib中jar 并打包_maven引入lib中的jar包-CSDN博客 解决办法&#xff0c;只需要在pom文件中加入 <includeSystemScope>true</includeSystemScope> <build><!-- <includeSystemScope>true</includeSystemScope&g…

Asp .Net Core 集成 NLog

简介 NLog是一个基于.NET平台编写的日志记录类库&#xff0c;它可以在应用程序中添加跟踪调试代码&#xff0c;以便在开发、测试和生产环境中对程序进行监控和故障排除。NLog具有简单、灵活和易于配置的特点&#xff0c;支持在任何一种.NET语言中输出带有上下文的调试诊断信息…

transformer剪枝论文汇总

文章目录 NN Pruning摘要实验 大模型剪枝LLM-PrunerSparseGPT LTPVTPWidth & Depth PruningPatch SlimmingDynamicViTSPViTDynamicBERTViT SlimmingFastFormersNViTUVCPost-training pruning NN Pruning 《Block Pruning For Faster Transformers》 《为更快的transformer…

删除和清空Hive外部表数据

外部表和内部表区别 未被external修饰的是内部表&#xff08;managed table&#xff09;&#xff0c;被external修饰的为外部表&#xff08;external table&#xff09;&#xff1b; 区别&#xff1a; 内部表数据由Hive自身管理&#xff0c;外部表数据由HDFS管理&#xff1b; …

Flink 2.0 状态存算分离改造实践

本文整理自阿里云智能 Flink 存储引擎团队兰兆千在 FFA 2023 核心技术&#xff08;一&#xff09;中 的分享&#xff0c;内容关于 Flink 2.0 状态存算分离改造实践的研究&#xff0c;主要分为以下四部分&#xff1a; Flink 大状态管理痛点 阿里云自研状态存储后端 Gemini 的存…

golang windows 环境搭建 环境配置

golang windows 环境搭建 环境配置 Golang学习之路一环境搭建 MacBook Linux 树莓派raspberrypi安装Golang环境 官网下载地址: https://go.dev/dl/ https://golang.google.cn/dl/ 下载对应系统版本&#xff0c;例如windows 64位系统&#xff0c;下载&#xff1a;xxx.window…

vue项目打包时如何去除文件的hash值?

默认情况下&#xff0c;生成的静态资源在它们的文件名中包含了 hash 以便更好的控制缓存。然而&#xff0c;这也要求 index 的 HTML 是被 Vue CLI 自动生成的。如果你无法使用 Vue CLI 生成的 index HTML&#xff0c;你可以通过将这个选项设为 false 来关闭文件名哈希。 vue.c…

uniapp 使用renderjs引入echarts

效果图&#xff1a; 1.1renderjs引入echarts 组件zmui-echarts.vue&#xff1a; <template><view class"zmui-echarts" :prop"option" :change:prop"echarts.delay"></view> </template><script>export defaul…

mac电脑快捷指令实现拼图

mac访达&#xff0c;搜索输入‘快捷指令’&#xff0c;找到‘快捷指令’&#xff0c; 点击快捷指令&#xff0c;进入快捷指令中心&#xff0c;搜索‘拼图’ &#xff0c;选中‘照片拼图’&#xff0c; 点击‘添加快捷指令’&#xff0c; 在‘所有快捷键指令’中可以看到添加的快…

我的docker随笔43:问答平台answer部署

本文介绍开源问答社区平台Answer的容器化部署。 起因 笔者一直想搭建一个类似stack overflower这样的平台&#xff0c;自使用了Typora&#xff0c;就正式全面用MarkdownTyporagit来积累自己的个人知识库&#xff0c;但没有做到web化&#xff0c;现在也还在探索更好的方法。 无…

Swift Combine 从入门到精通一

1. Combine 简介 用 Apple 官方的话来说&#xff0c;Combine 是: a declarative Swift API for processing values over time. Combine 是 Apple 用来实现函数响应式编程的库&#xff0c; 类似于 RxSwift。 RxSwift 是 ReactiveX 对 Swift 语言的实现。 Combine 使用了许多可以…

论文阅读-Transformer-based language models for software vulnerability detection

「分享了一批文献给你&#xff0c;请您通过浏览器打开 https://www.ivysci.com/web/share/biblios/D2xqz52xQJ4RKceFXAFaDU/ 您还可以一键导入到 ivySCI 文献管理软件阅读&#xff0c;并在论文中引用 」 本文主旨&#xff1a;本文提出了一个系统的框架来利用基于Transformer的语…