【OpenCV-图像形态学操作】礼帽与黑帽、梯度运算、开运算与闭运算、形态学-膨胀操作、形态学-腐蚀操作

news2024/11/16 17:56:26

1 形态学-腐蚀操作

import cv2
img = cv2.imread('./img/dige.png')

cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

# 创建一个 3x3 的结构元素(内核)
# np.ones() 函数用于生成一个指定形状的数组,其中所有的元素都初始化为 1

# (3, 3) 是内核的形状,表示生成一个 3x3 的二维数组
# np.uint8 表示数组元素的数据类型为无符号 8 位整数
# 在图像处理中的形态学操作中,结构元素用于定义操作时考虑的邻域

# kernel 是用于形态学操作(如腐蚀、膨胀)的结构元素
# 全部元素为 1 的内核在腐蚀和膨胀操作中常用于处理二值图像
kernel = np.ones((3, 3), np.uint8)

# 对图像应用腐蚀操作
# cv2.erode() 函数用于对图像进行腐蚀操作,常用于图像处理中的形态学操作
# img 是输入图像,通常为二值图像(黑白图像),但也可以是灰度图像或彩色图像

# cv2.erode() 函数应用腐蚀操作
# kernel 是用于腐蚀的结构元素
# iterations = 1 表示进行 1 次腐蚀操作,迭代次数可以调整以增加腐蚀的强度

# 腐蚀操作会使图像中的白色区域(前景)变小,黑色区域(背景)变大
erosion = cv2.erode(img, kernel, iterations=1)


cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

pie = cv2.imread('./img/pie.png')

cv2.imshow('pie', pie)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

kernel = np.ones((30,30),np.uint8) 
erosion_1 = cv2.erode(pie,kernel,iterations = 1)
erosion_2 = cv2.erode(pie,kernel,iterations = 2)
erosion_3 = cv2.erode(pie,kernel,iterations = 3)
res = np.hstack((erosion_1,erosion_2,erosion_3))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

2 形态学-膨胀操作

img = cv2.imread('./img/dige.png')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

import cv2  # 导入 OpenCV 库
import numpy as np  # 导入 NumPy 库,用于数组操作

# 创建一个 3x3 的核,所有元素均为 1
kernel = np.ones((3, 3), np.uint8)  # 创建一个 3x3 的矩形结构元素(核),数据类型为无符号 8 位整型

# 应用腐蚀操作
erosion = cv2.erode(img, kernel, iterations=1)  # 使用 cv2.erode 函数对图像应用腐蚀操作
# 参数解释:
# img:输入图像,通常是 BGR 色彩空间的图像
# kernel:用于腐蚀操作的结构元素(核),在这里是一个 3x3 的矩形
# iterations:腐蚀操作的迭代次数,设置为 1 表示只进行一次腐蚀

# 显示腐蚀处理后的图像
cv2.imshow('erosion', erosion)  # 使用 imshow 函数显示图像,窗口标题为 'erosion'

# 等待用户按键
cv2.waitKey(0)  # 等待用户按键,无参数表示无限等待,直到按下任意键

# 关闭所有 OpenCV 窗口
cv2.destroyAllWindows()  # 关闭所有由 imshow 函数创建的窗口

在这里插入图片描述

# 创建一个 3x3 的结构元素(内核)
# np.ones() 函数用于生成一个指定形状的数组,其中所有的元素都初始化为 1
# (3, 3) 表示生成一个 3x3 的二维数组
# np.uint8 表示数组元素的数据类型为无符号 8 位整数
# 在图像处理中,结构元素用于定义形态学操作时考虑的邻域
# 这里创建的全 1 的内核在膨胀操作中用于扩展前景区域
kernel = np.ones((3, 3), np.uint8)

# 对经过腐蚀处理的图像应用膨胀操作
# cv2.dilate() 函数用于对图像进行膨胀操作,膨胀操作是形态学处理的一种
# dige_erosion 是经过腐蚀处理的图像,通常是二值图像
# kernel 是用于膨胀的结构元素(或内核),在这里使用的是全 1 的 3x3 内核
# iterations = 1 表示进行 1 次膨胀操作,迭代次数可以调整以增加膨胀的强度
# 膨胀操作会使图像中的白色区域(前景)变大,黑色区域(背景)变小
dige_dilate = cv2.dilate(dige_erosion, kernel, iterations=1)


cv2.imshow('dilate', dige_dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()
pie = cv2.imread('./img/pie.png')

kernel = np.ones((30,30),np.uint8) 
dilate_1 = cv2.dilate(pie,kernel,iterations = 1)
dilate_2 = cv2.dilate(pie,kernel,iterations = 2)
dilate_3 = cv2.dilate(pie,kernel,iterations = 3)
res = np.hstack((dilate_1,dilate_2,dilate_3))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

3 开运算与闭运算

# 开:先腐蚀,再膨胀
img = cv2.imread('./img/dige.png')

kernel = np.ones((5,5),np.uint8) 
# 对图像应用开运算
# cv2.morphologyEx() 函数用于执行复杂的形态学操作,这里进行的是开运算

# img 是输入图像,通常为二值图像,但也可以是灰度图像或彩色图像
# cv2.MORPH_OPEN 是指定的形态学操作类型,表示开运算(Opening)
# kernel 是用于形态学操作的结构元素,通常是一个预定义的形状,例如全 1 的内核
# 在这里使用的是之前创建的结构元素 kernel

# 开运算是先进行腐蚀操作再进行膨胀操作
# 这种操作用于去除小的前景区域(噪声)并平滑前景边界
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)


cv2.imshow('opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

4 梯度运算

# 梯度=膨胀-腐蚀
pie = cv2.imread('pie.png')
kernel = np.ones((7,7),np.uint8) 
dilate = cv2.dilate(pie,kernel,iterations = 5)  # 碰撞运算
erosion = cv2.erode(pie,kernel,iterations = 5)  # 腐蚀运算

res = np.hstack((dilate,erosion))

cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

# 对图像应用梯度运算
# cv2.morphologyEx() 函数用于执行复杂的形态学操作,这里进行的是梯度运算

# pie 是输入图像,通常为二值图像,但也可以是灰度图像或彩色图像
# cv2.MORPH_GRADIENT 是指定的形态学操作类型,表示梯度运算(Gradient)
# kernel 是用于形态学操作的结构元素,通常是一个预定义的形状,例如全 1 的内核
# 在这里使用的是之前创建的结构元素 kernel

# 梯度运算是对图像进行膨胀操作和腐蚀操作的差异
# 这种操作用于检测图像的边缘
# 梯度图像显示了图像中的前景和背景之间的边缘信息

gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel)  # 梯度运算


cv2.imshow('gradient', gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

5 礼帽与黑帽

  • 礼帽 = 原始输入-开运算结果
  • 黑帽 = 闭运算-原始输入
import cv2  # 导入 OpenCV 库
import numpy as np  # 导入 NumPy 库,用于数组操作

# 读取图像
img = cv2.imread('./img/dige.png')  # 使用 imread 函数读取图像文件,路径为 './img/dige.png'

# 创建一个 3x3 的核,所有元素均为 1
kernel = np.ones((3, 3), np.uint8)  # 创建一个 3x3 的矩形结构元素(核),数据类型为无符号 8 位整型

# 应用礼帽变换
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)  # 使用 cv2.morphologyEx 函数应用礼帽变换
# 参数解释:
# img:输入图像,通常是 BGR 色彩空间的图像
# cv2.MORPH_TOPHAT:礼帽变换的操作类型
# kernel:用于形态学操作的结构元素(核),在这里是一个 3x3 的矩形

# 显示礼帽变换处理后的图像
cv2.imshow('tophat', tophat)  # 使用 imshow 函数显示图像,窗口标题为 'tophat'

# 等待用户按键
cv2.waitKey(0)  # 等待用户按键,无参数表示无限等待,直到按下任意键

# 关闭所有 OpenCV 窗口
cv2.destroyAllWindows()  # 关闭所有由 imshow 函数创建的窗口

在这里插入图片描述

import cv2  # 导入 OpenCV 库
import numpy as np  # 导入 NumPy 库,用于数组操作

# 读取图像
img = cv2.imread('./img/dige.png')  # 使用 imread 函数读取图像文件,路径为 './img/dige.png'

# 创建一个 3x3 的核,所有元素均为 1
kernel = np.ones((3, 3), np.uint8)  # 创建一个 3x3 的矩形结构元素(核),数据类型为无符号 8 位整型

# 应用黑帽变换
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)  # 使用 cv2.morphologyEx 函数应用黑帽变换
# 参数解释:
# img:输入图像,通常是 BGR 色彩空间的图像
# cv2.MORPH_BLACKHAT:黑帽变换的操作类型
# kernel:用于形态学操作的结构元素(核),在这里是一个 3x3 的矩形

# 显示黑帽变换处理后的图像
cv2.imshow('blackhat', blackhat)  # 使用 imshow 函数显示图像,窗口标题为 'blackhat'

# 等待用户按键
cv2.waitKey(0)  # 等待用户按键,无参数表示无限等待,直到按下任意键

# 关闭所有 OpenCV 窗口
cv2.destroyAllWindows()  # 关闭所有由 imshow 函数创建的窗口

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2120089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务器深度解析:五大关键问题一网打尽

在科技飞速发展的今天,服务器的重要性不言而喻。但对于服务器的一些关键问题,你真的清楚吗?今天,我们就来为大家深度解析服务器的五大关键问题,满满的干货知识,让你轻松了解服务器的奥秘。 一、“路” 与 …

NS3的3.36版本将Eclipse作IDE

1 配置Eclipse 1.1 安装JDK JDK的tar包下载传送门 下载之后,在当前目录解压(以jdk1.8.0_333为例)。 sudo mkdir /usr/lib/jvm # 在/usr/lib/jvm目录下新建目录 sudo mv jdk1.8.0_333 /usr/lib/jvm # 将解压的文件移动到我们的新建目录下…

Re-ReST: Reflection-Reinforced Self-Training for Language Agents论文学习

文章首先提到了一个推理-动作轨迹数据集的问题。这些数据集经常会包括一些需要多步推理的任务。但是,无论是让人去取得这些数据,还是让更高质量的模型代劳,成本都太高了。因此最好是自我监督,自己产生数据来学习(self-…

在Excel中通过Python运行公式和函数实现数据计算

目录 一、引言 1.1 背景介绍 1.2 Python in Excel 的意义 二、环境准备 2.1 安装必要的软件 2.2 配置 Excel 三、基础操作 3.1 输入 Python 代码 3.2 调用 Python 库 四、案例分析 4.1 数据读取与处理 4.1.1 读取 Excel 数据 4.1.2 数据处理 4.2 数据可视化 4.2…

SprinBoot+Vue学生信息管理系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质…

【信息论与编码原理】自学成才还在学ing

绪论 多的咱不写,只写干干的 点对点通讯系统模型 干扰和噪声不可避免 消息是 信息的载体,消息包含信息,是具体的非物理的 信息是有效的data 信号是 适合信道传输的物理量,可携带消息,可以显示或者描述 香农信息定义…

Java重修笔记 第五十二天 Junit

Junit 的使用 1. 为了方便程序员测试某一个方法而使用 2. 在方法上面加上 Test 并引用 5.X 版本 3. 就能在方法前面看到可运行的按钮 public class Homework07 {public static void main(String[] args) {}Testpublic void testList() {DAO<User> dao new DAO<&g…

大数据与人工智能:脑科学与人工神经网络ANN

文章目录 大数据与人工智能&#xff1a;脑科学与人工神经网络ANN一、引言ANN简介研究背景与应用领域发展背景应用场景 二、ANN背后的人脑神经网络人脑神经网络的专业描述神经元的结构信号处理 思考和认知过程认知功能的实现 对机器学习算法的启示 三、ANN的研究进展初始阶段&am…

通过docker overlay2目录名查找容器名和容器ID

有时候经常会有个别容器占用磁盘空间特别大&#xff0c;这个时候就需要通过docker overlay2 日录名查找对应容器名. 1.首先进入到 /var/lib/docker/overlay2 目录下 # cd /var/lib/docker/overlay2 2.查看谁占用容间最大 # du -h -d 1 | grep G |sort -nr 3.再通过目录名查找…

存储课程学习笔记4_设计数据结构管理nvme磁盘(基于已经通过struct nvme_user_io和ioctl实现了对nvme设备的读写)

已经测试了直接操作nvme磁盘的方式&#xff0c;那么基于可以读写nvme磁盘的功能&#xff0c;如何扩展呢。 通过struct nvme_user_io结构体ioctl实现对nvme磁盘的读写访问&#xff0c;可以定义结构&#xff0c;对整个磁盘进行管理&#xff0c;以配合业务进行衍生功能。 0&…

使用Idea新建一个Demo项目基于WebApp目录下的服务器访问测试-作业篇

文章目录 前言一、Maven环境搭建二、创项目总结 前言 例如&#xff1a;第一堂JAVAweb 轻量级的项目搭建运行作业。 一、Maven环境搭建 环境变量配置 新建系统变量 MAVEN_HOMEC:\apache-maven-3.6.3path后边加上 %MAVEN_HOME%\bin然后控制台cmd 检查变量配置是否完全 mvn -v…

ABC 370 E - Avoid K Partition

原题链接&#xff1a;E - Avoid K Partition 题意&#xff1a;给长度为n的数组&#xff0c;将数组划分成任意份&#xff0c;但是每一份的总和都不能是k&#xff0c;问有多少种分割方法。 思路&#xff1a;dp&#xff0c;f[i]&#xff0c;代表前i个元素满足题意的划分的总和&a…

申请Shopify PayPal账号的时间和所需资料如下

申请流程 注册账户&#xff1a; 访问 PayPal官网。点击右上角的“注册”按钮&#xff0c;选择“企业账户”。输入电子邮箱地址和密码&#xff0c;点击“继续”。填写公司信息&#xff1a; 提供公司名称、营业执照地址、联系方式等信息。确保公司名称与营业执照上的名称一致。填…

1.2 半导体二极管笔记

文章目录 一、符号二、 伏安特性1、正向特性2、反向特性3、反向击穿特性 二、二极管的主要参数1、最大整流电流 I F I_F IF​2、反向击穿电压 U B R U_{BR} UBR​3、反向饱和电流 I S I_S IS​4、最高工作频率 f m f_m fm​5、极间电容 C d C_d Cd​ 四、二极管的测试1、二极管…

突破最强算法模型,Transformer !!

这几天&#xff0c;大家对于Transformer的问题&#xff0c;还是不少。 今儿再和大家聊聊~ 简单来说&#xff0c;Transformer 是一种神经网络模型&#xff0c;在机器翻译、语言理解等任务中表现特别好。它的核心思想是自注意力机制&#xff08;Self-Attention&#xff09;&…

el-image(vue 总)

一 加载静态资源 在第一次使用vue3开发项目时&#xff0c;使用require&#xff08;‘图片路径’&#xff09;&#xff0c;结果浏览器报错&#xff1a; Uncaught (in promise) ReferenceError: require is not defined 因为require是webpack提供的一种加载能力&#xff0c;但…

经典文献阅读之--Multi S-Graphs(一种高效的实时分布式语义关系协同SLAM)

0. 简介 协作同时定位与建图&#xff08;CSLAM&#xff09;对于使多个机器人能够在复杂环境中操作至关重要。大多数CSLAM技术依赖于原始传感器测量或低级特征&#xff0c;如关键帧描述符&#xff0c;这可能由于缺乏对环境的深入理解而导致错误的闭环。此外&#xff0c;这些测量…

[SDK]-菜单 和 树控件

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解菜单和树控件的相关知识 菜单 认识菜单 及 创建自定义菜单栏 资源文件 -> 项目名.rc ->Menu 这是系统提供的默认菜单&#xff0c;也可以往里面添加修改内容 以下是 自定义菜单栏&#xff1a; 创…

如何通过Autoscaler实现Kubernetes的伸缩?

本文将介绍如何在流量高峰之前使用KEDA和Cron scaler主动调整工作负载规模。 在设计Kubernetes集群时&#xff0c;我们可能经常需要回答以下问题&#xff1a; 集群伸缩需要多长时间&#xff1f;在新Pod创建之前需要等待多长时间&#xff1f; 有四个主要因素会影响集群的伸缩…

Windows环境下 VS2022 编译 OGG 源码

OGG OGG音频编码格式&#xff0c;全称为Ogg Vorbis&#xff0c;是一种开源且无专利限制的音频压缩格式。它被设计用来提供高质量的音频存储和传输&#xff0c;同时保持较小的文件大小。OGG Vorbis支持多声道音频&#xff0c;并且可以处理可变比特率&#xff0c;这意味着它可以根…