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

news2025/1/20 3:56:41

原理

图像处理中的开操作(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 plt

img = 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.coloradmin.cn/o/1447208.html

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

相关文章

H12-821_31

31.下面是一台路由器的部分配置,关于该配置描述正确的是: A.源地址为1.1.1.1的数据包匹配第一条ACL语句rule 0,匹配规则为允许 B.源地址为1.1.1.3的数据包匹配第三条ACL语句rule 2,匹配规则为拒绝 C.源地址为1.1.1.4的数据包匹配第四条ACL语句rule 3,匹配规则为允许 D.源地址为…

【动态规划】:泰波那契模型_解码方法

朋友们、伙计们,我们又见面了,本专栏是关于各种算法的解析,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数据结构专栏&…

Codeforces Round 169 (Div. 2)C. Little Girl and Maximum Sum(差分、贪心)

文章目录 题面链接题意题解代码总结 题面 链接 C. Little Girl and Maximum Sum 题意 给q个[l,r]将所有这些区间里面的数相加和最大。 可以进行的操作是任意排列数组 题解 对出现的每个区间内的位置加上1,代表权值 操作完之后求一遍前缀和,得到每个…

通俗易懂搞定forEach和map的区别和使用

前言 在前端开发的时候,我们有时候需要对后端传过来的数组的进行相应的遍历处理,但是很多小伙伴对map和forEach两个方法的界限还是有模糊,本文从具体的示例来弄清楚两者的相同点和不同点 相同点 1.都是用于遍历数组的方法,可以…

关于氢能,什么是绿氢、蓝氢、灰氢?

今年3月,国家有关部门出台《氢能产业发展中长期规划(2021—2035年)》,明确了氢的能源属性,同时明确氢能是战略性新兴产业的重点方向是构建绿色低碳产业体系、打造产业转型升级的新增长点。一时间,氢能发展也受到了万众瞩目。我国目前已经成为世界最大的制氢国年制氢产量约…

L2-002 链表去重

一、题目 二、解题思路 结构体数组的下标表示该节点的地址,value 表示该节点的值,next 表示下一个结点的地址。result1 表示去重后的链表的节点的地址,result2 表示被删除的链表的节点的地址。 flag 表示节点对应的值是否出现过,…

【小赛1】蓝桥杯双周赛第5场(小白)思路回顾

我的成绩:小白(5/6) 完稿时间:2024-2-13 比赛地址:https://www.lanqiao.cn/oj-contest/newbie-5/ 相关资料: 1、出题人题解:“蓝桥杯双周赛第5次强者挑战赛/小白入门赛”出题人题解 - 知乎 (zhihu.com) 2、矩阵快速幂&…

《Java 简易速速上手小册》第9章:Java 开发工具和框架 (2024 最新版)

文章目录 9.1 Maven 和 Gradle - 构建与依赖管理的神兵利器9.1.1 基础知识9.1.2 重点案例:使用 Maven 构建 Spring Boot 应用9.1.3 拓展案例 1:使用 Gradle 构建多模块项目9.1.4 拓展案例 2:利用 Gradle Wrapper 确保构建的一致性 9.2 Spring…

【JavaEE Spring】Spring 原理

Spring 原理 1. Bean的作⽤域1.1 概念1.2 Bean的作⽤域 2. Bean的⽣命周期 1. Bean的作⽤域 1.1 概念 在Spring IoC&DI阶段, 我们学习了Spring是如何帮助我们管理对象的. 通过 Controller , Service , Repository , Component , Configuration ,Bean 来声明Bean对象。通…

数学建模:K-means聚类手肘法确定k值(含python实现)

原理 当K-means聚类的k值不被指定时,可以通过手肘法来估计聚类数量。   在聚类的过程中,随着聚类数的增大,样本划分会变得更加精细,每个类别的聚合程度更高,那么误差平方和(SSE)会逐渐变小&am…

备战蓝桥杯---图论基础理论

图的存储&#xff1a; 1.邻接矩阵&#xff1a; 我们用map[i][j]表示i--->j的边权 2.用vector数组&#xff08;在搜索专题的游戏一题中应用过&#xff09; 3.用邻接表&#xff1a; 下面是用链表实现的基本功能的代码&#xff1a; #include<bits/stdc.h> using nam…

那些 C语言指针 你不知道的小秘密 (完结篇)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能…

蓝桥杯嵌入式第11届真题(完成) STM32G431

蓝桥杯嵌入式第11届真题(完成) STM32G431 题目 代码 程序和之前的大同小异&#xff0c;不过多解释 main.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief :…

第4讲 小程序首页实现

首页 create.vue <template><view class"vote_type"><view class"vote_tip_wrap"><text class"type_tip">请选择投票类型</text><!-- <text class"share">&#xe739;分享给朋友</text&g…

免费分享一套PyQt6学生信息管理系统 Python管理系统 Python源码,挺漂亮的

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的PyQt6学生信息管理系统 Python管理系统 Python源码&#xff0c;分享下哈。 项目视频演示 【免费】PyQt5 学生信息管理系统 Python管理系统 Python源码 Python毕业设计_哔哩哔哩_bilibili【免费】PyQt5 学生…

康熙字典的部首里为啥没有王字旁

很多汉字的偏旁部首&#xff0c;是“王”&#xff0c;但在康熙字典的部首列表里&#xff0c;却没有它。而新华字典是有的。 这不科学啊&#xff0c;于是我还通过Unicode编码查了下康熙部首的编码部分&#xff0c;确认了一下&#xff0c;发面里面确实没有。 康熙部首&#xff08…

顺序表、链表(ArrayList、LinkedList)

目录 前言&#xff1a; 顺序表&#xff08;ArrayList&#xff09;&#xff1a; 顺序表的原理&#xff1a; ArrayList源码&#xff1a; 的含义&#xff1a;​编辑 ArrayList的相关方法&#xff1a;​编辑 向上转型List&#xff1a; 练习题&#xff08;杨辉三角&#x…

单页404源码

<!doctype html> <html> <head> <meta charset"utf-8"> <title>简约 404错误页</title><link rel"shortcut icon" href"./favicon.png"><style> import url("https://fonts.googleapis.co…

Java中抽象类和接口的区别

抽象类和接口都是 Java 中多态的常见使用方式. 都需要重点掌握. 同时又要认清两者的区别(重要!!! 常见面试题)。 核心区别: 抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写而重写抽象方法), 而接口中不能包含普通方法&#xff08;接口…

生成式人工智能(AIGC)之最全详解图解

生成式人工智能&#xff08;AIGC&#xff09;之最全详解图解 1. AIGC的发展历程1.1 AIGC演化重要时间节点AIGC发展历程图OpenAI大语言模型发展进程 1.2技术推进路线 2.AIGC技术场景2.1 技术场景 3.1AIGC相关应用4.AIGC未来发展前景 1. AIGC的发展历程 AIGC&#xff08;AI-Gene…