Opencv形态学的膨胀操作、开运算与闭运算、梯度运算、礼帽与黑帽操作
文章目录
- 一、膨胀操作
- 二、开运算与闭运算
- 三、梯度运算
- 四、礼帽与黑帽操作
一、膨胀操作
膨胀操作也就是根据图片将边缘的一些细节给丰富,处理的程度取决于卷积核的大小还有膨胀次数。也就是腐蚀操作的相反操作(腐蚀操作参考我的上一篇文章 点击跳转)。
拿下面的这张照片来举个例子:

通过膨胀操作:
# 导入OpenCV库,用于图像处理
import cv2
# 导入matplotlib的pyplot模块,用于图像显示
import matplotlib.pyplot as plt
# 导入numpy库,用于数值计算
import numpy as np# 使用cv2.imread()函数读取位于指定路径的图像文件
img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\4.jpg")# 创建一个30x30的矩形结构元素,用于形态学操作
# np.ones((30,30),np.uint8)创建一个所有元素都是1的30x30矩阵
kernel = np.ones((30, 30), np.uint8)# 使用cv2.dilate()函数对图像进行膨胀操作一次
dilate_1 = cv2.dilate(img, kernel, iterations=1)# 使用cv2.dilate()函数对图像进行膨胀操作两次
dilate_2 = cv2.dilate(img, kernel, iterations=2)# 使用cv2.dilate()函数对图像进行膨胀操作三次
dilate_3 = cv2.dilate(img, kernel, iterations=3)# 使用numpy的hstack()函数将三个膨胀后的图像水平堆叠在一起
res = np.hstack((dilate_1, dilate_2, dilate_3))# 显示堆叠后的图像
cv2.imshow("res", res)
# 等待用户按下任意键
cv2.waitKey(0)
# 关闭所有OpenCV创建的窗口
cv2.destroyAllWindows()
膨胀一次:

膨胀两次:

膨胀三次:

二、开运算与闭运算
开运算是先进行腐蚀操作,然后进行膨胀操作,用于去除小的物体
拿以下图片来举例子:

经过开运算:
# 导入OpenCV库,用于图像处理
import cv2
# 导入matplotlib的pyplot模块,用于图像显示
import matplotlib.pyplot as plt
# 导入numpy库,用于数值计算
import numpy as np# 使用cv2.imread()函数读取位于指定路径的图像文件
img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\3.jpg")# 创建一个5x5的矩形结构元素,用于形态学操作
# np.ones((5,5),np.uint8)创建一个所有元素都是1的5x5矩阵
kernel = np.ones((10, 10), np.uint8)# 使用cv2.morphologyEx()函数对图像进行开运算
# 开运算是先进行腐蚀操作,然后进行膨胀操作,用于去除小的物体
# cv2.MORPH_OPEN指定要执行的形态学操作是开运算
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)# 使用cv2.imshow()函数显示开运算后的图像
cv2.imshow("opening", opening)
# 使用cv2.waitKey(0)函数等待,直到用户按下任意键
cv2.waitKey(0)
# 使用cv2.destroyAllWindows()函数关闭所有OpenCV创建的窗口
cv2.destroyAllWindows()
运行结果:

具体优化效果根据卷积核而进行调整改变。
闭运算是先进行膨胀操作,然后进行腐蚀操作,用于填充物体内部的小洞或连接临近物体
经过闭运算:
# 导入OpenCV库,用于图像处理
import cv2
# 导入matplotlib的pyplot模块,用于图像显示
import matplotlib.pyplot as plt
# 导入numpy库,用于数值计算
import numpy as np# 使用cv2.imread()函数读取位于指定路径的图像文件
img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\3.jpg")# 创建一个10x10的矩形结构元素,用于形态学操作
# np.ones((10,10),np.uint8)创建一个所有元素都是1的10x10矩阵
kernel = np.ones((10, 10), np.uint8)# 使用cv2.morphologyEx()函数对图像进行闭运算
# 闭运算是先进行膨胀操作,然后进行腐蚀操作,用于填充物体内部的小洞或连接临近物体
# cv2.MORPH_CLOSE指定要执行的形态学操作是闭运算
opening = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)# 使用cv2.imshow()函数显示闭运算后的图像
cv2.imshow("opening", opening)
# 使用cv2.waitKey(0)函数等待,直到用户按下任意键
cv2.waitKey(0)
# 使用cv2.destroyAllWindows()函数关闭所有OpenCV创建的窗口
cv2.destroyAllWindows()
运行结果:

三、梯度运算
梯度 = 膨胀 - 腐蚀,形态学梯度是膨胀和腐蚀操作的差值,用于突出物体的边缘
展示膨胀和腐蚀的效果:
import cv2
import matplotlib.pyplot as plt
import numpy as npimg = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\4.jpg")kernel = np.ones((7, 7),np.uint8)
dilate = cv2.dilate(img,kernel,iterations = 5)
erosion = cv2.erode(img,kernel,iterations = 5)res = np.hstack((dilate , erosion))cv2.imshow("res",res)
cv2.waitKey(0)
cv2.destroyAllWindows()

梯度计算:
# 导入OpenCV库,用于图像处理
import cv2
# 导入matplotlib的pyplot模块,用于图像显示
import matplotlib.pyplot as plt
# 导入numpy库,用于数值计算
import numpy as np# 使用cv2.imread()函数读取位于指定路径的图像文件
img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\4.jpg")# 创建一个7x7的矩形结构元素,用于形态学操作
# np.ones((7,7),np.uint8)创建一个所有元素都是1的7x7矩阵
kernel = np.ones((7, 7), np.uint8)# 使用cv2.morphologyEx()函数计算图像的形态学梯度
# 形态学梯度是膨胀和腐蚀操作的差值,用于突出物体的边缘
# cv2.MORPH_GRADIENT指定要执行的形态学操作是梯度运算
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)# 使用cv2.imshow()函数显示形态学梯度后的图像
cv2.imshow("gradient", gradient)
# 使用cv2.waitKey(0)函数等待,直到用户按下任意键
cv2.waitKey(0)
# 使用cv2.destroyAllWindows()函数关闭所有OpenCV创建的窗口
cv2.destroyAllWindows()
运算结果:

四、礼帽与黑帽操作
礼帽 = 原始输入-开运算结果 礼帽变换的目的是突出图像中比其周围环境更亮的物体或特征。
黑帽 = 闭运算结果 - 原始输入 黑帽变换是图像的腐蚀版本减去图像的膨胀版本,用于突出比周围暗的物体
礼帽:
import cv2
import matplotlib.pyplot as plt
import numpy as npimg = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\3.jpg")kernel = np.ones((10, 10), np.uint8)
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)cv2.imshow("gradient",tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()
运算结果:

原始输入(带有毛刺)- 开运算结果(去除毛刺) = 周围的毛刺(上图)
黑帽:
# 导入OpenCV库,用于图像处理
import cv2
# 导入matplotlib的pyplot模块,用于图像显示
import matplotlib.pyplot as plt
# 导入numpy库,用于数值计算
import numpy as np# 使用cv2.imread()函数读取位于指定路径的图像文件
img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\3.jpg")# 创建一个10x10的矩形结构元素,用于形态学操作
# np.ones((10,10),np.uint8)创建一个所有元素都是1的10x10矩阵
kernel = np.ones((10, 10), np.uint8)# 使用cv2.morphologyEx()函数对图像进行黑帽变换
# 黑帽变换是图像的腐蚀版本减去图像的膨胀版本,用于突出比周围暗的物体
# cv2.MORPH_BLACKHAT指定要执行的形态学操作是黑帽变换
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)# 使用cv2.imshow()函数显示黑帽变换后的图像
cv2.imshow("blackhat", blackhat)
# 使用cv2.waitKey(0)函数等待,直到用户按下任意键
cv2.waitKey(0)
# 使用cv2.destroyAllWindows()函数关闭所有OpenCV创建的窗口
cv2.destroyAllWindows()
运行结果:

相关文章:
Opencv形态学的膨胀操作、开运算与闭运算、梯度运算、礼帽与黑帽操作
文章目录 一、膨胀操作二、开运算与闭运算三、梯度运算四、礼帽与黑帽操作 一、膨胀操作 膨胀操作也就是根据图片将边缘的一些细节给丰富,处理的程度取决于卷积核的大小还有膨胀次数。也就是腐蚀操作的相反操作(腐蚀操作参考我的上一篇文章 点击跳转&am…...
keil 中添加gcc编译 stmf207
一、安装下载arm-gcc 编译器: 二、在keil中配置gcc: 三、配置工程选项 1.配置gcc编译规则: Misc Controls : -mcpucortex-m3 -mthumb -fdata-sections -ffunction-sections 注: 1.这里我用的cortex-m3,如果你是m4内核…...
BEV相关
1.deformable DETR是在DETR基础上做了什么 Deformable DETR 是对经典 DETR(Detection Transformer)进行的改进,旨在解决 DETR 训练速度慢、对大目标的定位不精确等问题。它主要在以下几个方面做了优化: 稀疏的多尺度注意力机制&a…...
nodepad++带时间段的关键字搜索筛选
10:11:[2-3][0-9].(com.asus.rogforum) 如图:冒号后面的[2-3]表示秒的十位20秒到30秒之间,如果想筛选多个则(com.asus.rogforum)中的多个关键字之间用|分隔...
【理论笔记】网工基础知识 1 —— 计算机网络基础知识
提示:学习网络工程师基础理论知识 计算机网络相关的基础知识 包括计算机网络的基本概念、组成部分、主要功能、分类、性能、常见术语、以及网络标准化组织 一、计算机网络的概述 1、计算机网络的基本概念 把分布在不同地理区域具有独立工作能力的计算机、终端&am…...
Z 字形变换
题目 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下: P A H N A P L S I I G Y I R之后,你的输出需要从左往右逐行…...
在JasperReports中自动生成序列号
前言 JasperReports是一个强大的Java报表工具,可以生成PDF、Excel、HTML等多种格式的报表。在设计报表时,我们经常需要为每条记录添加一个唯一的序号。本文将详细介绍如何在JasperReports中实现这一功能。 准备工作 在开始之前,请确保您已…...
SpringBoot3 + MyBatisPlus 快速整合
一、前言 MyBatis 最佳搭档,只做增强不做改变,为简化开发、提高效率而生。 这个发展到目前阶段已经很成熟了,社区也比较活跃,可以放心使用。官网地址:https://baomidou.com 二、快速开始 引入依赖 这里我引入了核心…...
单片机(学习)2024.10.9
目录 汇编整体分类 1.指令 2.伪操作 3.伪指令 汇编代码 汇编初始化 数据搬运指令 算术运算指令 加法 减法 乘法 比较指令 跳转指令 逻辑运算指令 与或,异或 左移右移 内存操作 LOAD/STORE 指令 写 读 CPU的栈机制 栈的概念 栈的种类 1.空栈(…...
操作符详解(C 语言)
目录 一、操作符的分类二、算数操作符1. 除法操作符2. 取余操作符 三、位移操作符1. 进制2. 原码、反码和补码3. 左移操作符(<<)和右移操作符(>>) 四、位操作符1. 按位与 &2. 按位或 |3. 按位异或 ^4. 按位取反 ~…...
自动化测试数据:如何正确地选择不同格式文件「详细介绍」?
自动化测试数据:如何正确地选择不同格式文件「详细介绍」? 前言1. 不同的格式文件对比2. 读取文件2.1 读取Excel文件2.2 读取CSV文件2.3 读取YAML文件2.3.1 字典2.3.2 列表2.3.3 混合类型2.3.4 包含列表的字典2.3.5 包含字典的列表2.3.6 复杂嵌套 2.4 读…...
OceanBase中扩容OCP节点step by step
许多用户在开始使用OceanBase时部署OCP,通常选择单节点部署。但随着后续业务规模的不断扩大,会开始担忧单节点OCP在面对故障时可能丧失对集群运维管控的连续性。鉴于此,会将现有的单节点OCP扩展至多节点部署,以此来确保OCP服务的高…...
国家人工智能创新应用先导区数据及城市人工智能先导区准自然实验数据(2006-2023年)
一、测算方式:参考C刊《当代财经》冯婉昕(2024)老师的做法,本文的核心解释变量为国家人工智能创新应用先导区政策 (AI)。企业的金融资产配置是企业生产经营的内生变量,因此,如果选择…...
搜维尔科技:感受、握持、推动、连接和挤压虚拟物体,SenseGlove触觉反馈手套拥有先进的触觉技术、一流的可用性和功能
感受、握持、推动、连接和挤压虚拟物体,SenseGlove触觉反馈手套拥有先进的触觉技术、一流的可用性和功能 感受、握持、推动、连接和挤压虚拟物体,SenseGlove触觉反馈手套拥有先进的触觉技术、一流的可用性和功能...
C++中的引用详解
C中的引用详解 什么是引用 引用是一种取别名的机制,用于为变量提供一个新的名字。在C中,引用的语法使用&符号。引用允许我们以一种更安全和直观的方式来操作变量。 为什么要使用指针 在C中,虽然引用提供了一些优势,但指针仍…...
软考中级 - 软件设计师学习笔记 - 1.3 计算机安全
1.3.1 安全威胁 计算安全:指的是计算机资产安全,是要保证这些计算机资产不受自然和人为的有害因素的威胁和危害。 1.3.2 加密技术和认证技术 加密技术:对称加密(私有密钥加密)、非对称加密(公开密钥加密)。对称加密(私钥/私有密…...
Unity3D相关知识点总结
Unity3D使用的是笛卡尔三维坐标系,并且是以左手坐标系进行展示的。 1.全局坐标系(global) 全局坐标系描述的是游戏对象在整个世界(场景)中的相对于坐标原点(0,0,0)的位置…...
牛顿迭代多维+原理推导
这是两个函数了两个变量的情况,对于三个函数两个变量,牛顿迭代的雅可比矩阵不能求逆, 右边的增量的求解就不能用这个公式了呢。对于有逆矩阵但不能求逆的公式,这个逆矩阵是求解线性方程时出现的,就可用不求逆的方法解…...
[自然语言处理]RNN
1 传统RNN模型与LSTM import torch import torch.nn as nntorch.manual_seed(6)# todo:基础RNN模型 def dem01():参数1:input_size 每个词的词向量维度(输入层神经元的个数)参数2:hidden_size 隐藏层神经元的个数参数3:…...
MySQL(B站CodeWithMosh)——2024.10.11(14)
ZZZZZZ目的ZZZZZZ代码ZZZZZZ重点ZZZZZZ操作(非代码,需要自己手动) 8- CASE运算符The CASE Operator_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1UE41147KC?p62&vd_sourceeaeec77dfceb13d96cce76cc299fdd08 在sql_store中&am…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
