当前位置: 首页 > 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 提供了类似的功能。 基本…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...