OpenCV入门(十一)快速学会OpenCV 10 形态学操作

OpenCV入门(十一)快速学会OpenCV 10 形态学操作

作者:Xiou

形态学,即数学形态学(Mathematical Morphology),是图像处理过程中一个非常重要的研究方向。
形态学主要从图像内提取分量信息,该分量信息通常对于表达和描绘图像的形状具有重要意义,通常是图像理解时所使用的最本质的形状特征。例如,在识别手写数字时,能够通过形态学运算得到其骨架信息,在具体识别时,仅针对其骨架进行运算即可。
形态学处理在视觉检测、文字识别、医学图像处理、图像压缩编码等领域都有非常重要的应用。

形态学操作主要包含:腐蚀、膨胀、开运算、闭运算、形态学梯度(Morphological Gradient)运算、顶帽运算(礼帽运算)、黑帽运算等操作。

腐蚀操作和膨胀操作是形态学运算的基础,将腐蚀和膨胀操作进行结合,就可以实现开运算、闭运算、形态学梯度运算、顶帽运算、黑帽运算、击中击不中等不同形式的运算。

形态学处理在图像处理上的应用有:消除噪声、边界提取、区域填充、连通分量提取、凸壳、细化、粗化,分割出独立的图像元素或者图像中相邻的元素,求取图像中明显的极大值区域和极小值区域,以及求取图像梯度等。

测试原图:
在这里插入图片描述

1.腐蚀

腐蚀是最基本的形态学操作之一,它能够将图像的边界点消除,使图像沿着边界向内收缩,也可以将小于指定结构体元素的部分去除。腐蚀用来“收缩”或者“细化”二值图像中的前景,借此实现去除噪声、元素分割等功能。例如,在图中,左图是原始图像,右图是对其腐蚀的处理结果。

在这里插入图片描述

语法格式:

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

● dst是腐蚀后所输出的目标图像,该图像和原始图像具有同样的类型和大小。
● src是需要进行腐蚀的原始图像,图像的通道数可以是任意的。但是要求图像的深度必须是CV_8U、CV_16U、CV_16S、CV_32F、CV_64F中的一种。
● kernel代表腐蚀操作时所采用的结构类型。它可以自定义生成,也可以通过函数cv2.getStructuringElement()生成。
● anchor代表element结构中锚点的位置。该值默认为(-1, -1),在核的中心位置。
● iterations是腐蚀操作迭代的次数,该值默认为1,即只进行一次腐蚀操作。
● borderType代表边界样式,一般采用其默认值BORDER_CONSTANT。该项的具体值如表所示。
在这里插入图片描述
● borderValue是边界值,一般采用默认值。在C++中提供了函数morphologyDefault BorderValue()来返回腐蚀和膨胀的“魔力(magic)”边界值,Python不支持该函数。

代码实例:


import cv2
# 读取图片
img = cv2.imread("test.jpg")

# 腐蚀
erode = cv2.erode(img, kernel=(3, 3), iterations=5)

# 图片展示
cv2.imshow("test", img)
cv2.imshow("erode", erode)
cv2.waitKey(0)
cv2.destroyAllWindows()


输出结果:

在这里插入图片描述

2.膨胀

膨胀操作是形态学中另外一种基本的操作。膨胀操作和腐蚀操作的作用是相反的,膨胀操作能对图像的边界进行扩张。膨胀操作将与当前对象(前景)接触到的背景点合并到当前对象内,从而实现将图像的边界点向外扩张。
如果图像内两个对象的距离较近,那么在膨胀的过程中,两个对象可能会连通在一起。膨胀操作对填补图像分割后图像内所存在的空白相当有帮助。二值图像的膨胀示例如图所示。

在这里插入图片描述
同腐蚀过程一样,在膨胀过程中,也是使用一个结构元来逐个像素地扫描要被膨胀的图像,并根据结构元和待膨胀图像的关系来确定膨胀结果。

语法结构:

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

● dst代表膨胀后所输出的目标图像,该图像和原始图像具有同样的类型和大小。
● src代表需要进行膨胀操作的原始图像。图像的通道数可以是任意的,但是要求图像的深度必须是CV_8U、CV_16U、CV_16S、CV_32F、CV_64F中的一种。
● element代表膨胀操作所采用的结构类型。它可以自定义生成,也可以通过函数cv2.getStructuringElement()生成。
参数kernel、anchor、iterations、borderType、borderValue与函数cv2.erode()内相应参数的含义一致。

代码实例:

# 读取图片
img = cv2.imread("white.png")

# 膨胀
dilate = cv2.dilate(img, kernel=(3, 3), iterations=5)

# 图片展示
cv2.imshow("dilate", dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果:

在这里插入图片描述

3.开运算

开运算进行的操作是先将图像腐蚀,再对腐蚀的结果进行膨胀。开运算可以用于去噪、计数等。

语法结构如下:

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

代码实例:

import cv2
img = cv2.imread("xiou.png")

# 开运算
open = cv2.morphologyEx(img, cv2.MORPH_OPEN, (3, 3), iterations=10)

# 图像展示
cv2.imshow('open', open)
cv2.imshow("test",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果:

在这里插入图片描述

4.闭运算

闭运算是先膨胀、后腐蚀的运算,它有助于关闭前景物体内部的小孔,或去除物体上的小黑点,还可以将不同的前景图像进行连接。

语法结构:

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

代码实例:

import cv2
img = cv2.imread("xiou.png")

# 闭运算
close = cv2.morphologyEx(img, cv2.MORPH_CLOSE, (3, 3), iterations=5)

# 图像展示
cv2.imshow('close', close)
cv2.imshow("test",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果:
在这里插入图片描述

5.形态学梯度运算

形态学梯度运算是用图像的膨胀图像减腐蚀图像的操作,该操作可以获取原始图像中前景图像的边缘。

语法结构如下:

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

代码实例:

import cv2
img = cv2.imread("xiou.png")

# 梯度运算
close = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, (5, 5), iterations=5)

# 图像展示
cv2.imshow('close', close)
cv2.imshow("test",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果:
在这里插入图片描述

6.礼帽运算

礼帽运算是用原始图像减去其开运算图像的操作。礼帽运算能够获取图像的噪声信息,或者得到比原始图像的边缘更亮的边缘信息。

法结构如下:

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

代码实例:

import cv2
img = cv2.imread("xiou.png")

# 礼帽运算
close = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, (5, 5), iterations=10)

# 图像展示
cv2.imshow('close', close)
cv2.imshow("test",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果:

在这里插入图片描述
在这里插入图片描述

7.黑帽运算

黑帽运算是用闭运算图像减去原始图像的操作。黑帽运算能够获取图像内部的小孔,或前景色中的小黑点,或者得到比原始图像的边缘更暗的边缘部分。

语法结构如下:

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

代码实例:

import cv2
img1 = cv2.imread("test.jpg")
img2 = cv2.imread("xiou.png")

# 黑帽运算
close1 = cv2.morphologyEx(img1, cv2.MORPH_BLACKHAT, (5, 5), iterations=10)
close2 = cv2.morphologyEx(img2, cv2.MORPH_BLACKHAT, (5, 5), iterations=10)
# 图像展示
cv2.imshow('close', close1)
cv2.imshow("test",close2)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果:

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java入门多线程一文通

一、面试经典 1.为什么使用多线程及其重要 为了使用户体验更好,服务的相应速度更快。现如今硬件不断发展,软件要求也逐渐提高,都是为了一个字:快。 2.进程、线程、管程(monitor 监视器) 3.多线程并行和…

字符函数和字符串函数(下)——“C”

各位CSDN的uu们你们好呀,今天小雅兰的内容依旧是字符函数和字符串函数呀,这篇博客会讲一些内存相关的函数,下面,让我们进入字符函数和字符串函数的世界吧 字符串查找 strstr strtok 错误信息报告 strerror 字符操作 内存操作函…

微信小程序搭建流程

一、申请微信开发者账号虽然开发微信小程序可以使用工具提供的测试号,但是测试号提供的功能极为有限,而且使用测试号开发的微信小程序不能上架发布。因此说我们想要开发一个可以上架的微信小程序,首先必须要申请微信开发者账号。大家尽可放心…

Python 四大主流 Web 编程框架

目前Python的网络编程框架已经多达几十个,逐个学习它们显然不现实。但这些框架在系统架构和运行环境中有很多共通之处,本文带领读者学习基于Python网络框架开发的常用知识,及目前的4种主流Python网络框架:Django、Tornado、Flask、Twisted。 …

Python带你制作一个属于自己的多功能音乐播放器

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 就是用Python做一个简易的音乐播放器,废话不多说,咱们直接开干 当然,今天做这个肯定不是最简单的,最简单的音乐播放器,9行代码足以 完整源码等直接在文末名片领…

什么是API?(详细解说)

编程资料时经常会看到API这个名词,网上各种高大上的解释估计放倒了一批初学者。初学者看到下面这一段话可能就有点头痛了。 API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开…

SpringCloud Alibaba 学习圣经,10万字实现 SpringCloud 自由

40岁老架构师尼恩的掏心窝: 现在拿到offer超级难,甚至连面试电话,一个都搞不到。 尼恩的技术社群中(50),很多小伙伴凭借 “左手云原生右手大数据 SpringCloud Alibaba 微服务“三大绝活,拿到了…

内卷把同事逼成了“扫地僧”,把Git上所有面试题整理成足足24W字Java八股文

互联网大厂更多的是看重学历还是技术?毫无疑问,是技术,技术水平相近的情况下,肯定学历高/好的会优先一点,这点大家肯定都理解。说实话,学弟学妹们找工作难,作为面试官招人也难呀!&am…

ChatGPT解答:python大批量读写ini文件时,性能很低,有什么解决方法吗,给出具体的思路和实例

ChatGPT解答: python大批量读写ini文件时,性能很低,有什么解决方法吗,给出具体的思路和实例 ChatGPTDemo Based on OpenAI API (gpt-3.5-turbo). python大批量读写ini文件时,性能很低,有什么解决方法吗&…

让ChatGPT介绍一下ChatGPT

申请新必应内测通过了,我在New Bing中使用下ChatGPT,让ChatGPT介绍一下ChatGPT 问题1:帮我生成一篇介绍chatGPT的文章,不少于2000字 回答: chatGPT是什么?它有什么特点和用途? chatGPT是一种…

【数据结构】链表OJ

Yan-英杰的主页 悟已往之不谏 知来者之可追 目录 ​编辑 ​编辑二、分享:OJ调试技巧 ​编辑三、链表的中间结点 ​编辑四、链表中倒数第k个结点 一、移除链表元素 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2,3,4,…

世界顶级五大女程序媛,不仅技术强还都是美女

文章目录1.计算机程序创始人:勒芙蕾丝伯爵夫人2.首位获得图灵奖的女性:法兰艾伦3.谷歌经典首页守护神:玛丽莎梅耶尔4.COBOL之母:葛丽丝穆雷霍普5.史上最强游戏程序媛-余国荔说起程序员的话,人们想到的都会是哪些理工科…

springcloud3 GateWay动态路由的案例操作

一 GateWay作用以及流程 1.1 GateWay的作用 gateway相当于所有服务的门户,将客户端请求与服务端应用相分离,客户端请求通过gateway后由定义的路由和断言进行转发,路由代表需要转发请求的地址,断言相当于请求这些地址时所满足的条…

前端前沿web 3d可视化技术 ThreeJS学习全记录

前端前沿web 3d可视化技术 随着浏览器性能和网络带宽的提升 使得3D技术不再是桌面的专利 打破传统平面展示模式 前端方向主要流向的3D图形库包括Three.js和WebGL WebGL灵活高性能,但代码量大,难度大,需要掌握很多底层知识和数学知识 Threej…

【动态规划】最长上升子序列、最大子数组和题解及代码实现

Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接 我会一直往里填充内容哒! &…

JDK如何判断自己是什么公司的

0x00 前言 因为一些事情,遇到了这样一个问题,JDK如何判断自己是什么公司编译的。因为不同的公司编译出来,涉及到是否商用收费的问题。 平时自己使用的时候,是不会考虑到JDK的编译公司是哪一个,都是直接拿起来用&#…

指针和数组笔试题解析【下篇】

文章目录👁️6.指针笔试题👀6.1.试题(1)👀6.2.试题(2)👀6.3.试题(3)👀6.4.试题(4)👀6.5.试题(5&am…

四边形不等式技巧(上)

文章目录1、引入1.1 题目描述1.2 思路分析1.3 代码实现1.4 小结2、题目二2.1 题目描述2.2 思路分析2.3 代码实现2.4 小结3、题目三:合并石子3.1 题目描述3.2 思路分析3.3 代码实现3.4 枚举优化3.5 对数器4、四边形不等式技巧特征5、应用:画家问题5.1 题目…

金三银四最近一次面试,被阿里P8测开虐惨了...

都说金三银四涨薪季,我是着急忙慌的准备简历——5年软件测试经验,可独立测试大型产品项目,熟悉项目测试流程...薪资要求?5年测试经验起码能要个20K吧 我加班肝了一页半简历,投出去一周,面试电话倒是不少&a…

javaSE系列之继承与多态

💗 💗 博客:小怡同学 💗 💗 个人简介:编程小萌新 💗 💗 如果博客对大家有用的话,请点赞关注再收藏 🌞 javaSE系列之继承与多态继承关键字extends父类与子类在子类中访问父类的成员变…
最新文章