《图像形态学运算全解析:原理、语法及示例展示》
简介: 本文详细介绍了图像形态学中的多种运算,包括腐蚀、膨胀、开运算、闭运算、形态学梯度运算、礼帽运算以及黑帽运算。分别阐述了各运算的原理、语法格式,并通过 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ÿ…...

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;而广播变量用来高效分发较大的对象,…...

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 提供了类似的功能。 基本…...

设计模式之破环单例模式和阻止破坏
目录 1. 序列化和反序列化2. 反射 这里单例模式就不多说了 23种设计模式之单例模式 1. 序列化和反序列化 这里用饿汉式来做例子 LazySingleton import java.io.Serializable;public class LazySingleton implements Serializable {private static LazySingleton lazySinglet…...

11.19c++面向对象+单例模式
编写如下类: class File{ FILE* fp }; 1:构造函数,打开一个指定的文件 2:write函数 向文件中写入数据 3:read函数,从文件中读取数据,以string类型返回 代码实现: #include <iostream>using namespace std;class…...

一文了解TensorFlow是什么
TensorFlow是一个开源的机器学习框架,由Google开发并维护。它提供了一个灵活且高效的环境,用于构建和训练各种机器学习模型。 TensorFlow的基本概念包括: 张量(Tensor):TensorFlow中的核心数据结构&#x…...

如何做好一份技术文档?
打造出色技术文档的艺术 在当今技术驱动的世界中,技术文档扮演着至关重要的角色。它不仅是工程师和开发人员之间交流的桥梁,更是产品和技术成功的隐形推手。一份优秀的技术文档宛如一张精准的航海图,能够引导读者穿越技术的迷雾,…...

Linux和Ubuntu的关系
Linux和Ubuntu的关系: 1. Linux本身是内核,Ubuntu系统是基于Linux内核的操作系统。 2. Linux内核操作系统的构成: 内核、shell、文件系统、应用程序 -应用程序:文本编辑器等 -文件系统:文件存放在存储设备上的组织方…...

软件工程之静态建模
静态模型:有助于设计包、类名、属性和方法特征标记(但不是方法体)的定义,例如UML类图。 用例的关系: 扩展关系: 扩展关系允许一个用例(可选)扩展另一个用例(基用例&…...

PICO VR串流调试Unity程序
在平时写Unity的VR程序的时候,需要调试自己写的代码,但是有的时候会发现场景过于复杂,不是HMD一体机能运行的,或者为了能够更方便的调试,不需要每次都将程序部署到眼睛里,这样非常浪费时间,对于…...

自媒体图文视频自动生成软件|03| 页面和结构介绍
代码获取方式在文本末尾🔚 *代码获取方式在文本末尾🔚 *代码获取方式在文本末尾🔚 *代码获取方式在文本末尾🔚 视频图片生成器 一个基于 Python 和 Web 的工具,用于生成带有文字和语音的视频以及图片。支持多种尺寸、…...

深入浅出摸透AIGC文生图产品SD(Stable Diffusion)
hihi,朋友们,时隔半年(24年11月),终于能腾出时间唠一唠SD了🤣,真怕再不唠一唠,就轮不到SD了,技术更新换代是在是太快! 朋友们,最近(24年2月)是真的没时间整理笔记,每天都在疯狂的学习Stable Diffusion和WebUI & ComfyUI,工作实在有点忙,实践期间在飞书上…...

解析生成对抗网络(GAN):原理与应用
目录 一、引言 二、生成对抗网络原理 (一)基本架构 (二)训练过程 三、生成对抗网络的应用 (一)图像生成 无条件图像生成: (二)数据增强 (三ÿ…...