当前位置: 首页 > news >正文

《图像形态学运算全解析:原理、语法及示例展示》

在这里插入图片描述

简介: 本文详细介绍了图像形态学中的多种运算,包括腐蚀、膨胀、开运算、闭运算、形态学梯度运算、礼帽运算以及黑帽运算。分别阐述了各运算的原理、语法格式,并通过 Python 代码结合具体示例图片(如erode.JPG、dilate.JPG、close.JPG等)展示了各运算的实际效果及对图像产生的改变,帮助读者理解这些图像形态学运算在图像处理中的应用。
如果您觉得我的文章对您有帮助,请您点赞收藏关注,我会持续为您带来更多跟OpenCV相关的文章。

《图像形态学运算全解析:原理、语法及示例展示》

  • 1 腐蚀
  • 2 膨胀
  • 3 开运算
  • 4 闭运算
  • 5 形态学梯度运算
  • 6 礼帽运算
  • 黑帽运算
  • 致谢

1 腐蚀

腐蚀的原理如下:
在这里插入图片描述
在这里插入图片描述
语法如下:
dst = cv2.erode(原始图像src,黑色方块的大小kernel,anchor锚点 ,iterations迭代次数默认为1,borderType边界样式一般不修改)
用下面这张图做例子,这张图片在我的jupyter notebook文件夹下起名erode.JPG,这是我的文件夹结构,用pycharm一样和代码放在同一个文件夹下就好:
在这里插入图片描述
在这里插入图片描述

import numpy as np
import cv2
image = cv2.imread("erode.JPG")
kernel = np.ones((5,5),dtype = np.uint8)
erode_image = cv2.erode(src = image , kernel = kernel )
cv2.imshow("original",image)
cv2.imshow("erode",erode_image)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述
根据腐蚀的原理,当黑色方框(kernel)经过画红线的白色部分时,前景色是黑色,背景色是白色。所以被腐蚀成黑色。通过腐蚀实现了去噪

2 膨胀

膨胀的原理与腐蚀相反:
在这里插入图片描述
语法如下:
dst = cv2.dilate(原始图像src,扫描元kernel,iterations迭代次数)
我们用下面这张图做例子,他在我的文件夹下命名为dilate.JPG
在这里插入图片描述
在这里插入图片描述

import numpy as np
import cv2
image = cv2.imread("dilate.JPG")
kernel = np.ones((5,5),dtype = np.uint8)
di_image = cv2.dilate(src = image,kernel = kernel ,iterations = 8)
cv2.imshow("original",image)
cv2.imshow("di",di_image)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述
这张图经过8次膨胀,从左边变到了右边,很多背景色被膨胀成前景色,导致了Z字母的增大。

3 开运算

是先腐蚀后膨胀,腐蚀可以去掉一些噪声(多余的边角料),但是会导致形状缩小,膨胀又把形状变大。
语法:
dst = cv2.morphologyEx(原始图像src,op = cv2.MORPH_OPEN,黑色方块的大小kernel,anchor锚点 ,iterations迭代次数默认为1,borderType边界样式一般不修改)
使用erode.JPG这个例子来展示一下效果

import numpy as np
import cv2
image = cv2.imread("erode.JPG")
kernel = np.ones((5,5),dtype = np.uint8)
erode_image = cv2.erode(src = image , kernel = kernel ,iterations = 4)
di_image = cv2.dilate(src = erode_image , kernel = kernel ,iterations = 4)
open_image = cv2.morphologyEx(src = image ,kernel = kernel ,iterations = 4 , op = cv2.MORPH_OPEN)
cv2.imshow("original",image)
cv2.imshow("erode",erode_image)
cv2.imshow("di",di_image)
cv2.imshow("open",open_image)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

4 闭运算

他和开运算相反,是先膨胀后腐蚀,他的作用是关闭前景图像中的小孔,比如下面这张图:
在这里插入图片描述
我把他命名为close.JPG存放在我的文件夹中:
在这里插入图片描述

import numpy as np
import cv2
image = cv2.imread("close.JPG")
kernel = np.ones((5,5),dtype = np.uint8)
di_image = cv2.dilate(src = image , kernel = kernel ,iterations = 4)
erode_image = cv2.erode(src = di_image , kernel = kernel ,iterations = 4)
close_image = cv2.morphologyEx(src = image ,kernel = kernel ,iterations = 4 , op = cv2.MORPH_CLOSE)
cv2.imshow("original",image)
cv2.imshow("erode",erode_image)
cv2.imshow("di",di_image)
cv2.imshow("close",close_image)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

5 形态学梯度运算

他是膨胀-腐蚀,语法是把cv2.morphologyEx的op参数改为cv2.MORPH_GRANDIENT
还用close.JPG作为例子展示一下效果:

import numpy as np
import cv2
image = cv2.imread("close.JPG")
kernel = np.ones((7,7),dtype = np.uint8)
di_image = cv2.dilate(src = image , kernel = kernel )
erode_image = cv2.erode(src = di_image , kernel = kernel)
new = di_image-erode_image
Grad = cv2.morphologyEx(src = image,kernel = kernel,op = cv2.MORPH_GRADIENT )
cv2.imshow("orginal",image)
cv2.imshow("di",di_image)
cv2.imshow("er",erode_image)
cv2.imshow("di-er",new)
cv2.imshow("Gra",Grad)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

6 礼帽运算

原图像-开运算得到的是边缘或者噪声
语法 op = cv2.MORPH_TOPHAT
下面用erode.JPG做案例:

import numpy as np
import cv2
image = cv2.imread("erode.JPG")
kernel = np.ones((5,5),dtype = np.uint8)
open_image = cv2.morphologyEx(src = image ,kernel = kernel ,iterations = 4 , op = cv2.MORPH_OPEN)
tophat_image = cv2.morphologyEx(src = image,kernel = kernel ,iterations = 4, op =cv2.MORPH_TOPHAT)
cv2.imshow("original",image)
cv2.imshow("open",open_image)
cv2.imshow("3",image-open_image)
cv2.imshow("tophat",tophat_image)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

黑帽运算

闭运算图-原始图像 = 内部的小孔 \ 边缘部分
op = cv2.MORPH_BLACKHAT
下面用close.JPG做案例:

import numpy as np
import cv2
image = cv2.imread("close.JPG")
kernel = np.ones((7,7),dtype = np.uint8)
Close_image = cv2.morphologyEx(src = image,kernel = kernel,op = cv2.MORPH_CLOSE )
black_image = cv2.morphologyEx(src = image,kernel = kernel ,op = cv2.MORPH_BLACKHAT)
cv2.imshow("orginal",image)
cv2.imshow("clo",Close_image)
cv2.imshow("minus",image-Close_image)
cv2.imshow("black",black_image)cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

致谢

本文参考了一些博主的文章,博取了他们的长处,也结合了我的一些经验,对他们表达诚挚的感谢,使我对 形态学操作 有更深入的了解,也推荐大家去阅读一下他们的文章。纸上学来终觉浅,明知此事要躬行:
【OpenCV-图像形态学操作】礼帽与黑帽、梯度运算、开运算与闭运算、形态学-膨胀操作、形态学-腐蚀操作
OpenCV(九)形态学操作4–礼帽与黑帽(顶帽与底帽)

相关文章:

《图像形态学运算全解析:原理、语法及示例展示》

简介: 本文详细介绍了图像形态学中的多种运算,包括腐蚀、膨胀、开运算、闭运算、形态学梯度运算、礼帽运算以及黑帽运算。分别阐述了各运算的原理、语法格式,并通过 Python 代码结合具体示例图片(如erode.JPG、dilate.JPG、close.…...

双十一线上服务调用链路追踪SkyWalking实战分析

序言 随着电商行业的飞速发展,双十一购物节已成为全球最大的购物狂欢节之一。在双十一期间,电商平台需要处理海量的用户请求和订单,这对系统的稳定性和性能提出了极高的要求。为了确保系统在高并发环境下的稳定运行,对线上服务的…...

网络安全究竟是什么? 如何做好网络安全

网络安全是如何工作的呢? 网络安全结合多层防御的优势和网络。每个网络安全层实现政策和控制。授权用户访问网络资源,但恶意参与者不得进行攻击和威胁。 我如何受益于网络安全? 数字化改变了我们的世界。我们的生活方式、工作、玩耍,和学习都发生了变化。每个组织希望提供…...

【C++】入门【一】

本节目标 一、C关键字(C98) 二、命名空间 三、C的输入输出 四、缺省函数 五、函数重载 六、引用 七、内联函数 八、auto关键字(C11) 九、范围for(C11) 十、指针空值nullptr(C11) 一.…...

【ArcGIS Pro实操第11期】经纬度数据转化成平面坐标数据

经纬度数据转化成平面坐标数据 数据准备ArcGIS操作步骤-投影转换为 Sinusoidal1 投影2 计算几何Python 示例 另:Sinusoidal (World) 和 Sinusoidal (Sphere) 的主要区别参考 数据准备 数据投影: 目标投影:与MODIS数据相同(Sinu…...

python学opencv|读取图像

【1】引言 前序学习了使用matplotlib模块进行画图,今天开始我们逐步尝试探索使用opencv来处理图片。 【2】学习资源 官网的学习链接如下: OpenCV: Getting Started with Images 不过读起来是英文版,可能略有难度,所以另推荐一…...

ffmpeg RTP PS推流

要实现 CRtpSendPs 类,使其能够将 H264 数据通过 RTP PS 流推送到指定的 URL,并支持 TCP 和 UDP 传输方式,您需要使用 FFmpeg 库。以下是该类的实现示例,包括必要的初始化、推流和退出函数。 步骤 初始化 FFmpeg 库:…...

Rust语言俄罗斯方块(漂亮的界面案例+详细的代码解说+完美运行)

tetris-demo A Tetris example written in Rust using Piston in under 500 lines of code 项目地址: https://gitcode.com/gh_mirrors/te/tetris-demo 项目介绍 "Tetris Example in Rust, v2" 是一个用Rust语言编写的俄罗斯方块游戏示例。这个项目不仅是一个简单…...

NUMA架构及在极速网络IO场景下的优化实践

NUMA技术原理 NUMA架构概述 随着多核CPU的普及,传统的对称多处理器(SMP)架构逐渐暴露出性能瓶颈。为了应对这一问题,非一致性内存访问(NUMA, Non-Uniform Memory Access)架构应运而生。NUMA架构是一种内存…...

Brain.js 用于浏览器的 GPU 加速神经网络

Brain.js 是一个强大的 JavaScript 库,它允许开发者在浏览器和 Node.js 环境中构建和训练神经网络 。这个库的目的是简化机器学习模型的集成过程,使得即使是没有深厚机器学习背景的开发者也能快速上手 。 概述 Brain.js 提供了易于使用的 API&#xff…...

Linux——用户级缓存区及模拟实现fopen、fweite、fclose

linux基础io重定向-CSDN博客 文章目录 目录 文章目录 什么是缓冲区 为什么要有缓冲区 二、编写自己的fopen、fwrite、fclose 1.引入函数 2、引入FILE 3.模拟封装 1、fopen 2、fwrite 3、fclose 4、fflush 总结 前言 用快递站讲述缓冲区 收件区(类比输…...

视觉感知与处理:解密计算机视觉的未来

文章目录 前言1. 计算机视觉的概述2. 计算机视觉的应用3. 运动感知与光流4. 人类视觉感知4.1 大脑中的视觉处理4.2 视觉缺陷与对比4.3 分辨率4.4 视觉错觉5. 图像采集与处理6. 图像处理流程7. 二值图像处理与分割8. 3D 机器视觉系统8.1 主动3D视觉8.2 立体视觉9. 商业机器视觉系…...

【大数据学习 | Spark-Core】广播变量和累加器

1. 共享变量 Spark两种共享变量:广播变量(broadcast variable)与累加器(accumulator)。 累加器用来对信息进行聚合,相当于mapreduce中的counter;而广播变量用来高效分发较大的对象&#xff0c…...

postgresql按照年月日统计历史数据

1.按照日 SELECT a.time,COALESCE(b.counts,0) as counts from ( SELECT to_char ( b, YYYY-MM-DD ) AS time FROM generate_series ( to_timestamp ( 2024-06-01, YYYY-MM-DD hh24:mi:ss ), to_timestamp ( 2024-06-30, YYYY-MM-DD hh24:mi:ss ), 1 days ) AS b GROUP BY tim…...

pywin32库 -- 读取word文档中的图形

文章目录 前置操作解析body中的图形解析页眉中的图形 前置操作 基于pywin32打开、关闭word应用程序; import pythoncom from win32com.client import Dispatch, GetActiveObjectdef get_word_instance():""" 获取word进程 实例"""py…...

GitLab使用示例

以下是从 新建分支开始,配置 GitLab CI/CD 的完整详细流程,涵盖每个步骤、配置文件路径和具体示例。 1. 新建分支并克隆项目 1.1 在 GitLab 上创建新分支 登录 GitLab,进入目标项目页面。依次点击 Repository > Branches。点击右上角 Ne…...

uniapp echarts tooltip formation 不识别html

需求: echarts 的tooltip 的域名太长,导致超出屏幕 想要让他换行 思路一: 用formation自定义样式实现换行 但是: uniapp 生成微信小程序, echart种的tooltip 的formation 识别不了html ,自定义样式没办…...

3D扫描对文博行业有哪些影响?

三维扫描技术对文博行业产生了深远的影响,主要体现在以下几个方面: 一、高精度建模与数字化保护 三维扫描技术通过高精度扫描设备,能够捕捉到文物的每一个细节,包括形状、纹理、颜色等,从而生成逼真的3D模型。这些模…...

面试(十一)

目录 一.IO多路复用 二.为什么有IO多路复用机制? 三.IO多路复用的三种实现方式 3.1 select select 函数接口 select 使用示例 select 缺点 3.2 poll poll函数接口 poll使用示例 poll缺点 3.3 epoll epoll函数接口 epoll使用示例 epoll缺点 四. 进程和线程的区别…...

React-useState的使用

useState 是 React 提供的一个 Hook,允许你在函数组件中添加和管理状态(state)。在类组件中,状态管理通常是通过 this.state 和 this.setState 来实现的,而在函数组件中,useState 提供了类似的功能。 基本…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...