机器学习:opencv--图像形态学
目录
前言
一、常用形态学操作
二、腐蚀和膨胀
1.图像腐蚀
2.图形膨胀
三、开运算和闭运算
1.开运算
2.闭运算
四、顶帽和黑帽
1.顶帽
2.黑帽
五、梯度运算
总结
前言
图像形态学是一种用于处理和分析图像形状和结构的技术。
一、常用形态学操作
- 膨胀(Dilation):扩展前景区域,使对象变大。
- 腐蚀(Erosion):缩小前景区域,去除小的噪声点。
- 开运算(Opening):先腐蚀后膨胀,用于去除小物体。
- 闭运算(Closing):先膨胀后腐蚀,用于填充小孔洞。
- 顶帽(Top-hat):原图像与开运算结果的差异。用于提取图像中比背景亮的细节,通常用于突出小的亮区域。
- 黑帽(Black-hat):闭运算结果与原图像的差异。用于提取图像中比背景暗的细节,通常用于突出小的暗区域。
- 梯度运算:梯度运算实际上是膨胀操作减去腐蚀操作的结果。
二、腐蚀和膨胀
1.图像腐蚀
- 缩小前景区域,去除小的噪声点。
import numpy as np
import cv2"""
图像腐蚀
dst = cv2.erode(src, kernel, dst,anchor,iterations,borderType,borderValue)
"""
sun = cv2.imread('sun.png')
cv2.imshow('sun', sun)
cv2.waitKey(0)kernel = np.ones((2, 2), np.uint8) # 设置kernel大小
erosion_1 = cv2.erode(sun, kernel, iterations=5)
cv2.imshow('erode', erosion_1)
cv2.waitKey(0)
输出:
- 左边是原图,右边是腐蚀之后的

2.图形膨胀
- 扩展前景区域,使对象变大。
import numpy as np
import cv2"""
图像膨胀
dst = cv2.dilate(img, kernel,iteration)
"""
text = cv2.imread('eng_text.png')
cv2.imshow('text', text)
cv2.waitKey(0)kernel = np.ones((2, 2), np.uint8)
text_new = cv2.dilate(text, kernel, iterations=3)
cv2.imshow('dilate', text_new)
cv2.waitKey(0)
输出:
- 左边是原图,右边是膨胀之后的图像

三、开运算和闭运算
1.开运算
- 先腐蚀后膨胀,用于去除小物体。
# 开运算 先腐蚀后膨胀
zw_noise = cv2.imread('zw_noise.png')
cv2.imshow('zw_noise', zw_noise)
cv2.waitKey(0)kernel = np.ones((2, 2), np.uint8)
zw_open = cv2.morphologyEx(zw_noise, cv2.MORPH_OPEN, kernel) # 先腐蚀 后膨胀
cv2.imshow('zw_open', zw_open)
cv2.waitKey(0)
输出:
- 左边是原图,右边是进行开运算之后的图片

2.闭运算
- 先膨胀后腐蚀,用于填充小孔洞。
zw = cv2.imread('zw.png')
cv2.imshow('zw', zw)
cv2.waitKey(0)kernel = np.ones((5, 5), np.uint8)
zw_close = cv2.morphologyEx(zw, cv2.MORPH_CLOSE, kernel) # 先腐蚀 后膨胀
cv2.imshow('zw_close', zw_close)
cv2.waitKey(0)
输出:
- 左边是原图,右边是经过闭运算之后的图
- 可以看出来指纹有些断开的地方连接起来了

四、顶帽和黑帽
1.顶帽
- 原图像与开运算结果的差异。用于提取图像中比背景亮的细节,通常用于突出小的亮区域。
sun = cv2.imread('sun.png')
cv2.imshow('sun', sun)
cv2.waitKey(0)kernel = np.ones((2, 2), np.uint8)
# 开运算
open_sun = cv2.morphologyEx(sun, cv2.MORPH_OPEN, kernel)
cv2.imshow('open_sun', open_sun)
cv2.waitKey(0)
# 顶帽
tophat = cv2.morphologyEx(sun, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出:
- 左边原图,中间开运算,右边顶帽运算
- 顶帽之后有种凹陷的感觉

2.黑帽
- 闭运算结果与原图像的差异。用于提取图像中比背景暗的细节,通常用于突出小的暗区域。
sun = cv2.imread('sun.png')
cv2.imshow('sun', sun)
cv2.waitKey(0)
kernel = np.ones((2, 2), np.uint8)
cv2.imshow('sun', sun)
cv2.waitKey(0)
# 闭运算
close_sun = cv2.morphologyEx(sun, cv2.MORPH_CLOSE, kernel)
cv2.imshow('close_sun', close_sun)
cv2.waitKey(0)
# 黑帽
blackhat = cv2.morphologyEx(sun, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('blackhat', blackhat)
cv2.waitKey(0)
输出:
- 左边原图,中间闭运算,右边黑帽之后的图片

五、梯度运算
- 用于提取图像的边缘,计算图像的变化率。
"""
梯度运算: 膨胀-腐蚀
"""
text = cv2.imread('eng_text.png')
# cv2.imshow('text', text)
# cv2.waitKey(0)kernel = np.ones((2, 2), np.uint8)
# 膨胀
pz_text = cv2.dilate(text, kernel, iterations=2)
cv2.imshow('pz_text', pz_text)
cv2.waitKey(0)
# 腐蚀
fs_text = cv2.erode(text, kernel, iterations=2)
cv2.imshow('fs_text', fs_text)
cv2.waitKey(0)
# 膨胀-腐蚀
text_new = cv2.morphologyEx(text, cv2.MORPH_GRADIENT, kernel)
cv2.imshow('text_new', text_new)
cv2.waitKey(0)
输出:
- 左边是膨胀的图片,中间是腐蚀的图片,右边是梯度运算之后的图片
- 有一种镂空的感觉

总结
这些处理方法主要用于图像的边缘检测和特征增强。通过膨胀,图像的前景区域会被扩展,填补细小的空洞;通过腐蚀,前景区域会被缩小,去除噪声。梯度运算(膨胀减腐蚀)则能够突出图像中的边缘信息,有助于识别和分析图像中的结构和形状。
相关文章:
机器学习:opencv--图像形态学
目录 前言 一、常用形态学操作 二、腐蚀和膨胀 1.图像腐蚀 2.图形膨胀 三、开运算和闭运算 1.开运算 2.闭运算 四、顶帽和黑帽 1.顶帽 2.黑帽 五、梯度运算 总结 前言 图像形态学是一种用于处理和分析图像形状和结构的技术。 一、常用形态学操作 膨胀(…...
网络基础入门指南(一)
前言 在这个高度互联的世界里,互联网已成为日常生活不可或缺的一部分。然而,对于许多人来说,网络是如何工作的仍然是个谜。本文旨在为那些对网络基础知识感兴趣的朋友提供一个简单的介绍,帮助大家更好地理解互联网的基本原理和技…...
【项目】云备份
云备份 云备份概述框架 功能演示服务端客户端 公共模块文件操作模块目录操作模块 服务端模块功能划分功能细分模块数据管理热点管理 客户端模块功能划分功能细分模块数据管理目录检查文件备份 云备份 概述 自动将本地计算机上指定文件夹中需要备份的文件上传备份到服务器中。…...
WebGL系列教程二(环境搭建及初始化Shader)
目录 1 前言2 新建html页面3 着色器介绍3.1 顶点着色器、片元着色器与光栅化的概念3.2 声明顶点着色器3.3 声明片元着色器 4 坐标系(右手系)介绍5 着色器初始化5.1 给一个画布canvas5.2 获取WebGL对象5.3 创建着色器对象5.4 获取着色器对象的源5.5 绑定着色器的源5.6 编译着色器…...
keepalive和nginx高可用集群
keepalived 和 nginx 高可用集群搭建 主备模式 zyj86主机和zyj87主机安装nginx和keepalived yum install nginx keepalived -y systemctl enable --now nginx.service keepalived.service主调度器配置 编辑zyj86主机(主)配置文件 vi /etc/keepalived…...
二分查找题总结
二分查找题总结 hot100搜索插入位置搜索二维矩阵在排序数组中查找元素的第一个和最后一个位置搜索旋转排序数组寻找旋转排序数组中的最小值寻找两个正序数组的中位数 hot100 搜索插入位置 题目链接: 35.搜索插入位置 代码: class Solution {public in…...
仕考网:公务员面试流程介绍
通知进面信息——资格审查——面试签到——抽签候考 面试形式: 面试分为结构化和无领导小组两种形式 1.在结构化面试中,当轮到某位考生时,引导员将在候考室宣布其编号,随后考生跟随引导人员前往考场入口。考生在开始考试时需回…...
(十五)SpringCloudAlibaba-Sentinel持久化到Nacos
前言 在前面我们已经将Sentinel配置的规则持久化到系统的文件中。本章节我们将Sentinel持久化到Nacos中; 传送门(Sentinel数据持久化到文件)https://blog.csdn.net/weixin_45876411/article/details/140742963 默认情况下 Sentinel 只能接收到 Nacos 推送的消息,但…...
GitHub图床
GitHub图床 文章目录 GitHub图床图床介绍Github访问GitHub手动修改hostsgithub520 加速器创建账户创建仓库创建token PicGoTypora 图床介绍 图床 存放图片的地方 为什么设置图床呢 在我认识图床之前, 有一个问题 [^放在typora上面的图片, 其实是一个链接, 并且将图片存放在本地…...
记一次高版本view-design的组件迁移到自身项目的低版本
背景 npm i -S view-design当前老项目使用view-design这个组件库,但是当我们去官网查看该组件库最新版本,竟然发现没有博主想用的image/ImagePreivew这两个基础组件 说实话,有点离谱了哈!! 自己造轮子? …...
QT运行ROS工程
文章目录 使用QT创建ROS工程项目配置修改cmake环境配置运行设置 运行 使用QT创建ROS工程 工程名字和路径 下一步(直接选择默认选项就可以)->完成 完成之后 是这样的 接下来在工作空间里面创建功能包 鼠标选中src点击右键->添加新文件 name::功能包的名字…...
电脑技巧:如何在Win11电脑上调整设置,让屏幕更加护眼?
目录 一、调整屏幕亮度 二、启用夜间模式 三、调整色彩设置 四、使用第三方护眼软件 五、保持良好的用眼习惯 总结 随着长时间使用电脑的人越来越多,护眼问题也变得越来越重要。Win11作为更新的操作系统,提供了更多的设置选项来帮助我们保护眼睛。本文将详细介绍如何在…...
【数据结构】排序算法篇二
【数据结构】排序算法篇二 1. 快速排序(hoare版本)(1)基本思想:(2)动态图解:(3)代码实现:(4)特性总结: 2. 快速…...
python进阶篇-day09-数据结构与算法(非线性结构与排序算法)
非线性结构(树状结构) 特点: 每个节点都可以有n个子节点(后继节点) 和 n个父节点(前驱节点) 代表: 树, 图...... 概述 属于数据结构之 非线性结构的一种, 父节点可以有多个子节点(后续节点) 特点 有且只有1个根节点 每个节点都可以有1个父节点及任意个子节点, 前提: 根节点除…...
线性代数基础
Base 对于矩阵 A,对齐做 SVD 分解,即 U Σ V s v d ( A ) U\Sigma V svd(A) UΣVsvd(A). 其中 U 为 A A T AA^T AAT的特征向量,V 为 A T A A^TA ATA的特征向量。 Σ \Sigma Σ 的对角元素为降序排序的特征值。显然,U、V矩阵…...
LCR 021
题目:LCR 021 解法一:计算链表长度 遍历两次,第一次获取链表长度 L(包括虚拟节点),第二次遍历到第 L-n 个节点(从虚拟节点遍历) public ListNode removeNthFromEnd(ListNode head, …...
【阿雄不会写代码】全国职业院校技能大赛GZ036第四套
也不说那么多了,要用到这篇博客,肯定也知道他是干嘛的,给博主点点关注点点赞!!!这样博主才能更新更多免费的教程,不然就直接丢付费专栏里了,需要相关文件请私聊...
Vue组件:使用$emit()方法监听子组件事件
1、监听自定义事件 父组件通过使用 Prop 为子组件传递数据,但如果子组件要把数据传递回去,就需要使用自定义事件来实现。父组件可以通过 v-on 指令(简写形式“”)监听子组件实例的自定义事件,而子组件可以通过调用内建…...
数据分析-埋点
1、数据埋点的定义 针对特定用户行为或事件进行捕获、处理何发送的相关技术及其实施过程。 2、数据埋点的原理 埋点是数据采集的重要方式。通过在页面上植入代码,监控用户行为(例:页面加载、按钮点击等)。用户一旦触发了该事件,就会根据埋点信息将相关数…...
【文心智能体】通过工作流使用知识库来实现信息查询输出,一键查看旅游相关信息,让出行多一份信心
欢迎来到《小5讲堂》 这是《文心智能体平台》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 创建灵感基本配置头像名称和简介人物设定角色与目标思考路…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
flow_controllers
关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...
