OpenCV学习(4.5) 图像的形态转换

2024-06-08 02:36

本文主要是介绍OpenCV学习(4.5) 图像的形态转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.目标

在本教程中:

  • 我们将学习不同的形态操作,如腐蚀、膨胀、开、闭等。
  • 我们将看到不同的函数,如: cv.erode()**、 **cv.dilate()**、 **cv.morphologyEx() 等。

理论:

图像的形态转换是图像处理中的一个重要领域,它基于数学形态学(Mathematical Morphology)的原理。数学形态学是一种基于集合论和积分几何的非线性图像处理方法,主要用于提取图像中的形状特征、滤波、图像分割、特征提取等。形态学变换是基于图像形状的一些简单操作。它通常在二值图像上执行。它需要两个输入,一个是我们的原始图像,第二个是决定操作性质的结构元素或内核。形态转换通常涉及基本的操作,如腐蚀(Erosion)、膨胀(Dilation)、开运算(Opening)、闭运算(Closing)等,以及这些基本操作的组合。

2.腐蚀

腐蚀的基本概念就像土壤侵蚀一样,只侵蚀前景对象的边界(总是尽量保持前景为白色)。那它有什么作用呢?内核在图像中滑动(如二维卷积)。只有当内核下的所有像素都为 1 时,原始图像中的像素(1 或 0)才会被视为 1,否则会被侵蚀(变为零)。

所以根据内核的大小,边界附近的所有像素都将被丢弃。因此,前景对象的厚度或大小在图像中减少或只是白色区域减少。它有助于消除小的白色噪音(如我们在“颜色空间”一章中所看到的),分离两个连接的对象等。

作为一个例子,我将使用一个 5x5 内核,内核元素均为1。让我们看看它是如何工作的:

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread(r'D:\study\EmotionDetection_RealTime-master\data\data\te\07.jpg')
# blur = cv.blur(img,(5,5))
kernel = np.ones((5, 5), np.uint8)eroded_image = cv.erode(img, kernel, iterations=1)
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(eroded_image),plt.title('Blurred')
plt.xticks([]), plt.yticks([])
plt.show()

腐蚀的基本概念就像土壤侵蚀一样,只侵蚀前景对象的边界(总是尽量保持前景为白色) 

 

 腐蚀的基本概念就像土壤侵蚀一样,只侵蚀前景对象的边界,对于黑色部分来说就是进行膨胀操作。

 

左侧是原始的清晰图像,右侧则是应用了图像腐蚀技术后的效果,您可以看到细节部分变得模糊,边缘减少了,对比度也有所降低 

3. 膨胀 

它与腐蚀正好相反。这里,如果内核下至少有一个像素为“1”,则像素元素为“1”。所以它会增加图像中的白色区域,或者增加前景对象的大小。通常情况下,在去除噪音的情况下,腐蚀后会膨胀。因为,腐蚀消除了白噪声,但它也缩小了我们的对象。所以我们扩大它。由于噪音消失了,它们不会再回来,但我们的目标区域会增加到腐蚀之前的状态。它还可用于连接对象的断开部分。

dilation = cv.dilate(img,kernel,iterations = 1)

 通常用于增加图像中的明亮区域或填充图像中的孔洞

可以明显感觉到,画面变亮了。

4.开运算

开运算是图像处理中的一种形态学操作,它首先对图像进行腐蚀,然后进行膨胀。这种操作通常用于去除图像中的噪声和小的明亮区域,同时保持图像的大致形状和结构不变。

开只是腐蚀的另一个名称,随后是膨胀。正如我们上面所解释的,它对消除噪音很有用。在这里,我们使用 **cv.morphologyEx()**。

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

将图像放大一点看,可以看到第二张加入高斯噪声后,通过开运算去除了这些噪声,并将图像前景进行膨胀。

笔者认为,这些噪声由于是散乱分布的,再进行二值化时部分被划为前景,部分被划为背景,但无论是前景还是背景,它们都是孤立的,第一步的腐蚀会去除哪些孤立的前景噪声,第二部 

 

这个是先进行腐蚀再进行膨胀的效果图,腐蚀除了将背景的噪声去除外,一些背景中的纹理也在一定程度的隐去了,而膨胀可以将这些纹理再现出来,甚至比原图还要强。 

5.闭运算

闭运算是图像处理中的一种形态学操作,它首先对图像进行膨胀,然后进行腐蚀。这种操作通常用于填充图像中的暗色区域和孔洞,同时保持图像的大致形状和结构不变。

 关闭与打开相反,膨胀后腐蚀。它在填充前景对象内的小孔或对象上的小黑点时很有用。

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

kernel  = (5,5) 

 

 kernel  = (10,10) 

 kernel  = (15,15)  

 

 可以看到,用来进行闭运算的核越大,消除黑色小块的能力越强,不过当核过于大的时候,就是前景与背景的分界变得模糊。

先膨胀后腐蚀 

kernel  = (5,5)  

 

kernel  = (10,10)   

 

kernel  = (15,15)   

 

可以看到,在使用的核相同的情况下,先膨胀后腐蚀,跟闭运算的结果不一样 。

先留着这个问题。

6.形态梯度 

它是图像的膨胀和腐蚀之间的差值。结果将类似于对象的轮廓。、

形态梯度是图像处理中的一种形态学操作,它用于强调图像中的边缘和细节。形态梯度的计算方法是先对图像进行膨胀,然后从膨胀后的图像中减去原始图像。这个操作的结果是一幅图像,其中只包含了原始图像中边缘和显著变化的部分。

形态梯度的计算可以用以下公式表示:

形态梯度(G)=膨胀(f)−腐蚀(f)

其中,f 是原始图像,膨胀(f) 和 腐蚀(f) 分别是图像的膨胀和腐蚀结果。

形态梯度操作可以用于图像分割、特征提取和边缘检测等任务。它对于突出图像中的线状结构和物体的轮廓非常有用。

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

 

7.顶帽 

它是原图像和原图像开运算结果的差值。

顶帽(Top Hat)变换是图像处理中的一种形态学操作,它用于突出图像中的明亮区域,同时抑制背景。顶帽变换的计算方法是先对图像进行开运算(即先腐蚀后膨胀),然后从原始图像中减去开运算的结果。这个操作的结果是一幅图像,其中只包含了原始图像中比周围区域亮的部分。

顶帽变换的公式可以表示为:

顶帽变换(T)=原始图像(f)−开运算(f)

其中,f 是原始图像,开运算(f) 是图像的开运算结果。

顶帽变换对于提取图像中的小而亮的细节非常有用,这些细节可能在图像的背景或较大物体的遮挡下不明显。

tophat = cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel)

8.黑帽 

黑帽

黑帽(Black Hat)变换是图像处理中的一种形态学操作,它用于突出图像中的暗色区域,同时抑制明亮区域。黑帽变换的计算方法是先对图像进行闭运算(即先膨胀后腐蚀),然后从闭运算的结果中减去原始图像。这个操作的结果是一幅图像,其中只包含了原始图像中比周围区域暗的部分。

黑帽变换的公式可以表示为:

黑帽变换(B)=闭运算(f)−原始图像(f)

其中,f 是原始图像,闭运算(f) 是图像的闭运算结果。

黑帽变换对于提取图像中的小而暗的细节非常有用,这些细节可能在图像的明亮区域或较大物体的遮挡下不明显。

它是原图像和原图像的闭的差值。

blackhat = cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel)

 

9.结构元素 

在前面的例子中,我们在 numpy 的帮助下手工创建了一个结构参量。它是长方形的。但在某些情况下,您可能需要椭圆/圆形的内核。因此,opencv 有一个函数,**cv.getStructuringElement()**。只要传递内核的形状和大小,就可以得到所需的内核。

 

# Rectangular Kernel
>>> cv.getStructuringElement(cv.MORPH_RECT,(5,5))
array([[1, 1, 1, 1, 1],[1, 1, 1, 1, 1],[1, 1, 1, 1, 1],[1, 1, 1, 1, 1],[1, 1, 1, 1, 1]], dtype=uint8)
# Elliptical Kernel
>>> cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))
array([[0, 0, 1, 0, 0],[1, 1, 1, 1, 1],[1, 1, 1, 1, 1],[1, 1, 1, 1, 1],[0, 0, 1, 0, 0]], dtype=uint8)
# Cross-shaped Kernel
>>> cv.getStructuringElement(cv.MORPH_CROSS,(5,5))
array([[0, 0, 1, 0, 0],[0, 0, 1, 0, 0],[1, 1, 1, 1, 1],[0, 0, 1, 0, 0],[0, 0, 1, 0, 0]], dtype=uint8)

这篇关于OpenCV学习(4.5) 图像的形态转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1040996

相关文章

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

Java数字转换工具类NumberUtil的使用

《Java数字转换工具类NumberUtil的使用》NumberUtil是一个功能强大的Java工具类,用于处理数字的各种操作,包括数值运算、格式化、随机数生成和数值判断,下面就来介绍一下Number... 目录一、NumberUtil类概述二、主要功能介绍1. 数值运算2. 格式化3. 数值判断4. 随机

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

Python实现视频转换为音频的方法详解

《Python实现视频转换为音频的方法详解》这篇文章主要为大家详细Python如何将视频转换为音频并将音频文件保存到特定文件夹下,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5. 注意事项

使用Python实现图片和base64转换工具

《使用Python实现图片和base64转换工具》这篇文章主要为大家详细介绍了如何使用Python中的base64模块编写一个工具,可以实现图片和Base64编码之间的转换,感兴趣的小伙伴可以了解下... 简介使用python的base64模块来实现图片和Base64编码之间的转换。可以将图片转换为Bas

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2