苦学Opencv的第十一天:图像的形态学操作

news2024/9/20 20:14:32

Python OpenCV从入门到精通学习日记:图像的形态学操作

前言

图像形态学是图像处理中的一个重要分支,主要关注图像中物体的形状和结构。通过形态学操作,我们可以对图像进行有效的分析和处理,例如图像的腐蚀与膨胀开运算与闭运算等。腐蚀和膨胀是图像形态学中的两种核心操作,通过这两种操作可以清除或强化图像中的细节。合理使用腐蚀和膨胀,还可以实现图像开运算、闭运算、梯度运算、顶帽运算和黑帽运算等极具特点的操作。接下来开始学习吧!!!

图像形态学操作
腐蚀
膨胀
开运算
闭运算
其他形态学运算
梯度运算
顶帽运算
黑帽运算

因为内容较多,我列举了目录,如下:

图像的形态学操作

  • Python OpenCV从入门到精通学习日记:图像的形态学操作
  • 前言
  • 1 腐蚀
  • 2 膨胀
  • 3 开运算
  • 4 闭运算
  • 5 形态学运算
    • 5.1 梯度运算
    • 5.2 顶帽运算
    • 5.3 黑帽运算
  • 小结

1 腐蚀

腐蚀操作可以让图像沿着自己的边界向内收缩。OpenCV通过“核”来实现收缩计算。“核”的英文名为kernel,在形态学中可以理解为“由n个像素组成的像素块”,像素块包含一个核心(核心通常在中央位置,也可以定义在其他位置)。像素块在图像的边缘移动,在移动过程中,核会将图像边缘那些与核重合但又没有越过核心的像素点都抹除,效果类似图12.1所示的过程,就像削土豆皮一样,将图像一层一层地“削薄”。(这里借用书上原图)

在这里插入图片描述
OpenCV将腐蚀操作封装成erode()方法。

dst = cv2.erode(src, kernel, anchor, iterations,borderType, borderValue)

src: 输入图像。
kernel: 腐蚀使用的核,可以自定义或使用OpenCV提供的预设。
anchor:可选参数,核的锚点位置。
iterations: 腐蚀操作的迭代次数,默认为1。
borderType: 边界处理方式,默认为cv2.BORDER_CONSTANT。
borderValue: 边界值,默认为0。

图像经过腐蚀操作之后,可以抹除一些外部的细节,如图12.2所示是一个卡通小蜘蛛,如果用一个5×5的像素块作为核对小蜘蛛进行腐蚀操作,可以得到如图12.3所示的结果。小蜘蛛的腿被当成外部细节抹除了,同时小蜘蛛的眼睛变大了,因为核从内部也“削”了一圈。
在这里插入图片描述
在OpenCV做腐蚀或其他形态学操作时,通常使用numpy模块来创建核数组。
比如:

 import numpy as np
 k = np.ones((5, 5), np.uint8)

这两行代码什么意思可以去看我前面的文章:链接: 苦学Opencv的第三天:像素的操作

这个数组作为erode()方法的核参数。除了5×5的结构,还可以使用3×3、9×9、11×11等结构,行列数越大,计算出的效果就越粗糙,行列数越小,计算出的效果就越精细。

代码示例:

import cv2
import numpy as np

# 读取图像
img = cv2.imread('image.png', 0)

# 创建结构元素
kernel = np.ones((3,3), np.uint8)

# 腐蚀操作
eroded_img = cv2.erode(img, kernel)

# 显示结果
cv2.imshow('Eroded Image', eroded_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如下:
在这里插入图片描述

🌟可以看出,仙人掌的刺并没有因此消失,但是刺明显变得模糊不清了。

2 膨胀

膨胀操作与腐蚀操作正好相反,它通过使用核来“扩展”图像的边界。

OpenCV将膨胀操作封装成dilate()方法。

dst = cv2.dilate(src, kernel, anchor, iterations,borderType, borderValue)

参数说明:
 src:原始图像。
 kernel:膨胀使用的核。
 anchor:可选参数,核的锚点位置。
 iterations:可选参数,腐蚀操作的迭代次数,默认值为1。
 borderType:可选参数,边界样式,建议默认。
 borderValue:可选参数,边界值,建议默认。
返回值说明:
 dst:经过膨胀之后的图像。

膨胀的效果也正好是与腐蚀相反。这里不多加介绍了,直接放个图像,大家就知道什么意思了。
在这里插入图片描述

代码示例:

# 膨胀操作
import cv2
import numpy as np

# 读取图像
img = cv2.imread('xianrenzhang.png')
cv2.imshow("img",img)
# 创建结构元素
kernel = np.ones((10,10), np.uint8)

# 腐蚀操作
dilated_img = cv2.dilate(img, kernel)

# 显示结果
cv2.imshow('Dilated Image', dilated_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如下:
在这里插入图片描述

🌟这里可以看出,过度膨胀后的图像就好像近视眼的世界,图像变得非常模糊。

3 开运算

开运算是先进行腐蚀操作,再进行膨胀操作,开运算可以用来抹除图像外部的细节(或者噪声)。

我们举个例子,这是一个二叉树:
在这里插入图片描述
我们先对齐进行腐蚀操作,那么连接的细线会因为腐蚀而消失

在这里插入图片描述
随后我们进行膨胀操作

在这里插入图片描述
🌟从结果中可以明显地看出:经过开运算之后,二叉树中的连接线消失了,只剩下光秃秃的节点。因为连接线被核当成“细节”抹除了,所以利用检测轮廓的方法可以统计二叉树节点数量,也就是说在某些情况下,开运算的结果还可以用来做数量统计。

4 闭运算

闭运算是先进行膨胀操作,再进行腐蚀操作,闭运算可以抹除图像内部的细节(或者噪声)。

闭运算正好与开运算相反。我们在这举个例子:假设有只身上有斑点的小蜘蛛
在这里插入图片描述
我们先对其膨胀
在这里插入图片描述
在进行腐蚀
在这里插入图片描述
🌟从结果中可以明显地看出:经过闭运算后,小蜘蛛身上的花纹都被抹除了,就连眼睛也被当成“细节”抹除了。闭运算除了会抹除图像内部的细节,还会让一些离得较近的区域合并成一块区域。

5 形态学运算

除了基本的腐蚀和膨胀操作,OpenCV还提供了梯度运算、顶帽运算和黑帽运算等高级形态学操作。OpenCV 提 供 了 一 个morphologyEx()形态学方法,包含所有常用的运算,其语法如下:

dst = cv2.morphologyEx(src, op, kernel, anchor,iterations, borderType, borderValue)

参数说明:
 src:原始图像。
 op:操作类型,具体值如表所示。
 kernel:操作过程中使用的核。
 anchor:可选参数,核的锚点位置。
 iterations:可选参数,迭代次数,默认值为1。
 borderType:可选参数,边界样式,建议默认。
 borderValue:可选参数,边界值,建议默认。
返回值说明:
 dst:操作之后得到的图像。
参数值含义
CV2.MORPH_ERODE腐蚀操作
CV2.MORPHDILATE膨胀操作
CV2.MORPH_OPEN开运算,先腐蚀后膨胀
CV2.MORPHCLOSE闭运算,先胀后腐蚀
CV2.MORPH_GRADIENT梯度运算,膨胀图减腐蚀图
CV2.MORPHTOPHAT顶幅运算,原始图减开运算图
CV2.MORPHBLACKHAT黑幅运算,闭运算图减原始图

morphologyEx()方法实现的腐蚀、膨胀、开运算和闭运算效果与前文中介绍的效果完全一致,这里不再赘述,下面我们学习3个特点鲜明的操作:梯度运算、顶帽运算和黑帽运算。

5.1 梯度运算

这里的梯度是指图像梯度,可以简单地理解为像素的变化程度。如果几个连续的像素,其像素值跨度越大,则梯度值越大

梯度运算是通过膨胀图像减去原始图像来突出显示图像的边缘。

通俗的讲,梯度运算的运算过程就是:让原图的膨胀图减去腐蚀图,因为膨胀图比原图大,腐蚀图比原图小,利用腐蚀图将膨胀图掏空,就得到了原图的轮廓图。当然,这只能等到一个大概的轮廓图,是不精准的。

具体的代码只是在前面的代码中修改函数为morphology(),在这里不再赘述。

5.2 顶帽运算

顶帽运算是原始图像减去开运算后的图像,用于提取图像的外部细节

5.3 黑帽运算

黑帽运算是闭运算后的图像减去原始图像,用于提取图像的内部细节

代码示例:

# 梯度运算
gradient_img = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

# 顶帽运算
tophat_img = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

# 黑帽运算
blackhat_img = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

# 显示结果
cv2.imshow('Gradient Image', gradient_img)
cv2.imshow('Top Hat Image', tophat_img)
cv2.imshow('Black Hat Image', blackhat_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

小结

通过今天的学习,我们掌握了图像形态学的基本操作,这些操作对于图像分析和特征提取非常有用。明天继续学习图形检测!!!

大家在实践中遇到任何问题,欢迎在评论区讨论交流。明天见!

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

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

相关文章

Java 并发编程:一文了解 Java 内存模型(处理器优化、指令重排序与内存屏障的深层解析)

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 022 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进…

VIN解析汽车详情|阿里云实现调用API接口

介绍: 本次解析通过阿里云云市场的云服务来实现通过17位车架号来自动识别车型的详细信息,首先需要准备选择一家可以提供查询的商品。 https://market.aliyun.com/apimarket/detail/cmapi00065864#skuyuncode5986400001 步骤1: 选择商品 如图点击免费…

【微软蓝屏】微软Windows蓝屏问题汇总与应对解决策略

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

关键词查找【Knuth-Morris-Pratt (KMP) 算法】

一个视频让你彻底学懂KMP算法_哔哩哔哩_bilibili KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。 第一步:计算模式串(子串)和next[j]数组 模式串 前2位字母的next[j]固定是0 和 1 后续字母的nex[j]&…

项目实战——外挂开发(30小时精通C++和外挂实战)

项目实战——外挂开发(30小时精通C和外挂实战) 外挂开发1-监控游戏外挂开发2-秒杀僵尸外挂开发3-阳光地址分析外挂开发4-模拟阳光外挂开发5-无限阳光 外挂开发1-监控游戏 外挂的本质 有两种方式 1,修改内存中的数据 2,更改内存中…

跟李沐学AI:池化层

目录 二维最大池化 填充、步幅和多个通道 平均池化层 池化层总结 二维最大池化 返回滑动窗口中的最大值。 图为池化窗口形状为 22 的最大池化层。着色部分是第一个输出元素,以及用于计算这个输出的输入元素: max(0,1,3,4)4。池化层与卷积层类似,不断…

数据库中的事务

一、理解事务 1、本质 事务由一组DML语句组成,这一组语句要么全部成功,要么全部失败。在逻辑上,事务就是一组sql语句,但在实际中,公共的数据库一定会高并发地接受各种事务的请求,所以一个事务要有4个属性…

centos7 xtrabackup mysql(8)增量备份(1)

centos7 xtrabackup mysql(8)增量备份(1) 参考 xtrabackup-8.0的安装、备份以及恢复(innoxtrabackup有待测试) https://blog.csdn.net/DWJRIVER/article/details/117792271 https://blog.csdn.net/qq_28…

力扣高频SQL 50 题(基础版)第四题

文章目录 力扣高频SQL 50 题(基础版)第四题584.寻找用户推荐人题目说明思路分析实现过程准备数据实现方式结果截图 力扣高频SQL 50 题(基础版)第四题 584.寻找用户推荐人 题目说明 表: Customer -------------------- | Colu…

Weakly Supervised Contrastive Learning 论文阅读

Abstract 无监督视觉表示学习因对比学习的最新成就而受到计算机视觉领域的广泛关注。现有的大多数对比学习框架采用实例区分作为预设任务,将每个实例视为一个不同的类。然而,这种方法不可避免地会导致类别冲突问题,从而损害所学习表示的质量…

智能算法驱动的爬虫平台:解锁网络数据的无限潜力

摘要 在信息爆炸的时代,网络数据如同深海宝藏,等待着有识之士发掘其无尽价值。本文将探索智能算法驱动的爬虫平台如何成为解锁这一宝库的关键,不仅剖析其技术优势,还通过实例展示它如何助力企业与开发者高效、稳定地采集数据&…

Codeforces Round 654 (Div. 2) C. A Cookie for You (模拟)

我认为这道题就是个脑筋急转弯。 首先我们知道当a b < n m的时候&#xff0c;饼干总数都不够人的总数&#xff0c;那肯定是NO。 并且注意题干&#xff0c;我们可以得知当a b的时候&#xff0c;第一类和第二类人可以任意选两种饼干中的一种。 之后我们可以分类讨论一下。 …

【SpringBoot】 4 Thymeleaf

官网 https://www.thymeleaf.org/ 介绍 Thymeleaf 是一个适用于 Web 和独立环境的现代服务器端 Java 模板引擎。 模板引擎&#xff1a;为了使用户界面和业务数据分离而产生的&#xff0c;它可以生成特定格式的文档&#xff0c;用于网站的模板引擎会生成一个标准的 html 文档…

【vue前端项目实战案例】Vue3仿今日头条App

本文将开发一款仿“今日头条”的新闻App。该案例是基于 Vue3.0 Vue Router webpack TypeScript 等技术栈实现的一款新闻资讯类App&#xff0c;适合有一定Vue框架使用经验的开发者进行学习。 项目源码在文章末尾 1 项目概述 该项目是一款“今日头条”的新闻资讯App&#xf…

防爆开关的类型及工作原理,你了解多少?

在工业生产中&#xff0c;安全始终是首要考量。特别是在易燃、易爆环境下的作业&#xff0c;如化工厂、油库、矿井等场所&#xff0c;任何微小的火花都可能引发灾难性的后果。防爆开关作为一种关键的安全设备&#xff0c;其重要性不言而喻。 【一、防爆开关的定义与重要性】 …

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(四)高斯牛顿法详解

一、高斯牛顿法详解 拓展阅读&#xff1a;高斯牛顿法详解_gauss-newton算法步骤-CSDN博客 1、梯度下降法 ​ ​ ​ 无论一阶泰勒展开&#xff0c;还是二阶泰勒展开都是关于增量​的方程。 2、牛顿法 ​ 这个自变量增量都是可求的。但是二阶求解复杂。因此为了简化有了下…

2023IMO预选题几何第6题

锐角 △ A B C \triangle ABC △ABC 的外接圆为 ω \omega ω, 圆 I I I 与 ω \omega ω 内切于 A A A, 且与 B C BC BC 切于点 D D D. 设直线 A B AB AB, A C AC AC 分别与 I I I 交于点 P P P, Q Q Q, 点 M M M, N N N 在直线 B C BC BC 上, 满足 B B B 是 …

【Golang 面试基础题】每日 5 题(九)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

探索Linux-1-虚拟机远程登陆XShell6远程传输文件Xftp6

Linux是什么&#xff1f; Linux是一个开源的操作系统内核&#xff0c;由林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;于1991年首次发布。它基于Unix操作系统&#xff0c;但提供了更多的自由和灵活性。Linux内核是操作系统的核心部分&#xff0c;负责管理系统资源、处理…