【Python_Opencv图像处理框架】图像形态学操作

news2024/12/30 3:52:10

写在前面

本篇文章是opencv学习的第三篇文章,主要讲解了图像的形态学有关操作,作为初学者,我尽己所能,但仍会存在疏漏的地方,希望各位看官不吝指正❤️


写在中间

读完这篇文章后,相信您便能信手拈来下面图片的效果。

在这里插入图片描述

一、腐蚀操作

( 1 )简单介绍

在图像处理中,腐蚀(Erosion)是一种常见的形态学操作,它可以将图像中的细节部分缩小或者消失。简单来说就是将图像中的毛刺腐蚀掉。

( 2 )操作实现

cv2.erode(img, kernel, iterations) 其他参数暂省略

img是输入图像

kernel是腐蚀操作的核,表示每个像素点周围的像素点的位置和权重

iterations是操作的次数

( 3 )代码示例

假设我们有一张二值化图像,我们可以通过以下代码实现一次腐蚀操作:

import cv2
import numpy as np
img = cv2.imread('image.png', 0)
kernel = np.ones((5, 5), np.uint8)
erosion = cv2.erode(img, kernel, iterations = 1)
cv2.imshow('Erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

( 4 )效果展示在这里插入图片描述

二、膨胀操作

( 1 )简单介绍

膨胀(Dilation)是与腐蚀相反的形态学操作,它可以使图像中的细节部分增大或者扩张。在图像处理中,膨胀操作可以用来连接断开的元素、消除小的空洞或者孔洞等。

( 2 )操作实现

cv2.dilate(img, kernel, iterations)

img是输入图像,

kernel是膨胀操作的核,表示每个像素点周围的像素点的位置和权重

iterations是操作的次数,

( 3 )代码示例

同样是假设我们有一张二值化图像,我们可以通过以下代码实现膨胀操作:

import cv2
import numpy as np

img = cv2.imread('image.png', 0)
kernel = np.ones((3, 3), dtype=np.uint8)
dilate = cv2.dilate(img, kernel, 2)  # 2为迭代次数,也就是执行2次膨胀操作

plt.imshow(dilate)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

( 4 )效果展示

在这里插入图片描述


三、开运算与闭运算

( 1 )简单介绍

仔细观察上面的图片,就会发现腐蚀操作虽然去除了毛刺,但使原始的线条变细
除了单独的腐蚀和膨胀操作,还可以通过它们的组合来实现更为复杂的形态学操作。其中,开运算和闭运算是两种常见的组合形态学操作,它们可以用来去噪声、消除空洞等一系列操作。下面,我们分别来介绍一下这两个操作。

开运算:先腐蚀,再膨胀

闭运算:先膨胀,再腐蚀

( 2 )操作实现

cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

img是输入图像
cv2.MORPH_OPEN是一个常量,代表开运算,是指将一个图像先进行腐蚀操作,然后再进行膨胀操作;
cv2.MORPH_CLOSE是一个常量,代表闭运算,是指将一个图像先进行膨胀操作,然后再进行腐蚀操作;
kernel是一个结构元素,用于定义形态学操作的形状和大小

( 3 )代码示例

# 开运算
img = cv2.imread("D:\python\Program\pythonProject\photos\csdn.png")
kernel = np.ones((5, 5), np.uint8)

opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

plt.imshow(opening)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

# 闭运算
img = cv2.imread("D:\python\Program\pythonProject\photos\csdn.png")
kernel = np.ones((5, 5), np.uint8)

closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

plt.imshow(closing)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

( 4 )效果展示

开运算

在这里插入图片描述

闭运算

在这里插入图片描述


四、梯度计算

( 1 )简单介绍

梯度运算就是用膨胀的图像减去腐蚀的图像,就可以获得原图像的边缘信息(梯度信息)。简言之,就是梯度=膨胀-腐蚀

( 2 )操作实现

gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel_gradient, iterations=1)

img是输入图像

cv2.MORPH_GRADIENT表示要进行的形态学操作类型,这里是梯度操作

kernel是一个结构元素,用于定义形态学操作的形状和大小

iterations=1:形态学操作的迭代次数,用于指定重复执行操作的次数。在这里,梯度操作只执行一次,因此该参数的值为1

( 3 )代码示例

img = cv2.imread("D:\python\Program\pythonProject\photos\csdn.png")
kernel = np.ones((7, 7), np.uint8)

gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

plt.imshow(gradient)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

( 4 )效果展示
在这里插入图片描述


五、礼帽与黑帽

( 1 )简单介绍

礼帽=原始输入-开运算结果
黑帽=闭运算-原始输入

( 2 )操作实现

cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

( 3 )代码示例

# 礼帽运算
img = cv2.imread("D:\python\Program\pythonProject\photos\csdn.png")
kernel = np.ones((7, 7), np.uint8)

tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
plt.imshow(tophat)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

# 黑帽运算
img = cv2.imread("D:\python\Program\pythonProject\photos\csdn.png")
kernel = np.ones((7, 7), np.uint8)

blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
plt.imshow(blackhat)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

( 4 )效果展示

礼帽:

在这里插入图片描述

黑帽:
在这里插入图片描述


写在最后

👍🏻 点赞,你的认可是我创作的动力!
⭐ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!

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

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

相关文章

给照片换底色(python+opencv)

给照片换底色(pythonopencv) 本篇目录: 🦄 一、分析照片基本信息 🦄 二、方法一(遍历图像,将像素值点替换修改为指定颜色) 🦄 三、修改图片颜色方法二(先转…

MySQL数据库索引

目录 0.知识回顾 1.数据库约束 一.索引 1.什么是索引 2.为什么要使用索引(作用) 3.索引的使用场景 4.如何使用索引 1.查看索引 2.创建索引 3.修改索引 4.删除索引 5.索引的分类 1.使用场景不同 2.按列区分 3.按数据组织方式 二.索引的数据结构 1.HASH 2.二叉搜…

如何设计自动化测试框架?阿里P7工程师耗时一个月总结而成

目录 一、什么是自动化测试框架 二、自动化测试框架的架构设计 三、自动化测试框架的最佳实践 四、自动化测试框架的组成部分 五、自动化测试框架的设计原则 六、如何选择自动化测试框架 七、自动化测试框架实例 八、结论 一、什么是自动化测试框架 自动化测试框架是一…

UE4/5多人游戏详解(八、游戏模式和游戏状态里的函数重写,插件内地图的地址做变量,做变量让按钮出现不同状态,插件内的所有代码)

目录 这里不写在插件里面,而是在游戏模式: 头文件: Cpp文件: 更改ini文件 进入地图设置模式: 写插件里面,做一个变量: 写变量 然后更改函数MenuSet: 在子系统中做变量&…

FPGA 20个例程篇:20.USB2.0/RS232/LAN控制并行DAC输出任意频率正弦波、梯形波、三角波、方波(四)

接着同样地我们也需要完成对千兆网口ETH模块和USB2.0模块的编写,实际上和UART串口模块的设计思想大同小异,也同样地需要完成两项关键功能即识别并解析报文、接收并发送数据,千兆网口ETH和USB2.0的底层驱动在前面的例程中也详细说明了&#xf…

常用的设计模式(单例模式、工厂模式等)

1.单例模式 概述: 在有些系统中,为了节省内存资源、保证数据内容的一致性,对某些类要求只能创建一个实例,这就是所谓的单例模式. 例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造…

Centos切换jdk版本

先安装了jdk1.8的版本,需要使用jdk17的版本 1.先安装jdk17,再配置环境变量: vim ~/.bashrc 2.在最后一行添加 ##这个添加的就是路径,一定要和自己jdk安装的路径是一致的 export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 3.然…

Mybatis框架超详解及运用总结

Mybatis 一、什么是Mybatils?二、第一个Mybatils程序2.1、创建springboot工程2.2、准备数据2.3、配置MyBatis2.4、编写SQL语句2.5、单元测试 三、JDBC四、数据库连接池五、lombok六、Mybatis基础操作6.1、删除6.2、新增6.2.1、主键返回 6.3、修改6.4、查询6.4.1、数…

【AI绘画】AI绘画的创意应用

目录 1.引言2.将AI生成的图像转化为数字艺术品2.1AI生成的画作拍卖2.2将AI生成的图像转化为雕塑 3.将AI生成的图像用于虚拟场景的创建3.1使用GAN生成虚拟人物3.2在虚拟场景中使用AI生成的图像 1.引言 当今的AI绘画技术已经发展到了让人惊艳的程度,不仅可以生成高质量…

【每日一题Day183】LC1187使数组严格递增 | dp

使数组严格递增【LC1187】 给你两个整数数组 arr1 和 arr2&#xff0c;返回使 arr1 严格递增所需要的最小「操作」数&#xff08;可能为 0&#xff09;。 每一步「操作」中&#xff0c;你可以分别从 arr1 和 arr2 中各选出一个索引&#xff0c;分别为 i 和 j&#xff0c;0 <…

缓存优化----SpringCache

spring cache spring Cache介绍 spring cache是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单地加一个注解&#xff0c;就能实现缓存功能。 Spring cache提供了一层抽象&#xff0c;底层可以切换不同的cache实现。具体就是通过CacheManager接口来统一不…

springboot JWT 搭建授权服务器

目录 0 基本介绍 0.1 课程视频 0.2 架构逻辑图 0.2.1 登录JWT与授权服务器交互 0.2.2 登录成功后JWT与gateway-server交互 路由限制 1 JWT私钥公钥 1.1 安装git ->win系统右键 -> git bash here 1.2 生成私钥jks文件 1.3 用私钥jks文件解析出公钥 1.4 保存 BEGI…

造型简约的机箱,安装简单兼容性好,安钛克P20C体验

我们准备组装一台新主机的时候&#xff0c;机箱确实很重要&#xff0c;它决定了主机的整体风格和兼容性。我比较喜欢用中塔机箱&#xff0c;像是上个月我新装的主机&#xff0c;用的就是安钛克P20C&#xff0c;这款机箱的设计很简约&#xff0c;而且还有多种版本可选&#xff0…

C++——模板进阶

文章目录 &#x1f490;专栏导读&#x1f490;文章导读&#x1f337;类型模板参数&#x1f337;非类型模板参数&#x1f337;模板的特化&#x1f338;引例&#x1f338;函数模板的特化&#x1f338;类模板特化&#x1f33c;全特化 &#x1f338;偏特化&#x1f33c;部分特化&am…

【下载器篇】IDM下载器个性化设置

【下载器篇】IDM下载器个性化设置 IDM个性化设置—【蘇小沐】 文章目录 【下载器篇】IDM下载器个性化设置1.实验环境 &#xff08;一&#xff09;下载类型扩展UA默认值 &#xff08;二&#xff09;工具栏样式&#xff08;改风格&#xff09;3D Style样式 &#xff08;三&#…

2023.4.23 自注意力机制

一般都是单向量输入&#xff0c;但是如果多向量输入应该如何处理呢&#xff1f;引出自注意力机制 多向量输入可能会有多种输出&#xff0c;如果输入n个向量&#xff0c;输出n个向量表明这是sequence labeling&#xff0c;比如对于一个英文句子&#xff0c;每一个单词都判断是什…

c++11 标准模板(STL)(std::priority_queue)(二)

适配一个容器以提供优先级队列 std::priority_queue 定义于头文件 <queue> template< class T, class Container std::vector<T>, class Compare std::less<typename Container::value_type> > class priority_queue; priority_queu…

Windows下编译UHD

1.安装Visual Studio 2019,下载地址https://download.csdn.net/download/qq_36314864/87719209 2.安装cmake,下载地址https://download.csdn.net/download/qq_36314864/87719747 安装完成后记得C:\Program Files\cmake-3.22.1-windows-x86_64\bin添加到环境变量里面,或者安…

数据结构修炼:链表习题讲解!!!

题一&#xff1a;移除链表元素 我们可以看出这道题是让我们删除特定数据&#xff0c;我们可以用双指针来解这道题&#xff1a; 如果首元素为val&#xff0c;那么cur和head一起后移&#xff1a; 如果没有碰到val&#xff0c;那么就会cur后移&#xff0c;并且提前将cur传给perv&a…

如何避免美国ASP主机服务器崩溃和故障?

在当今数字化时代&#xff0c;网站是一个公司展示其业务的主要方式之一。因此&#xff0c;公司的在线业务应该始终保持高可用性和可靠性。ASP主机服务器是一种用于托管网站的服务器&#xff0c;其特点是可靠性高。但是&#xff0c;即使是最可靠的服务器也会遭受故障或崩溃。在本…