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

相关文章

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

在PyCharm中安装PyTorch、torchvision和OpenCV详解

《在PyCharm中安装PyTorch、torchvision和OpenCV详解》:本文主要介绍在PyCharm中安装PyTorch、torchvision和OpenCV方式,具有很好的参考价值,... 目录PyCharm安装PyTorch、torchvision和OpenCV安装python安装PyTor

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

Python实现AVIF图片与其他图片格式间的批量转换

《Python实现AVIF图片与其他图片格式间的批量转换》这篇文章主要为大家详细介绍了如何使用Pillow库实现AVIF与其他格式的相互转换,即将AVIF转换为常见的格式,比如JPG或PNG,需要的小... 目录环境配置1.将单个 AVIF 图片转换为 JPG 和 PNG2.批量转换目录下所有 AVIF 图

详解如何通过Python批量转换图片为PDF

《详解如何通过Python批量转换图片为PDF》:本文主要介绍如何基于Python+Tkinter开发的图片批量转PDF工具,可以支持批量添加图片,拖拽等操作,感兴趣的小伙伴可以参考一下... 目录1. 概述2. 功能亮点2.1 主要功能2.2 界面设计3. 使用指南3.1 运行环境3.2 使用步骤4. 核