Python图像运算之腐蚀与膨胀详解

 更新时间:2022年05月06日 09:41:20   作者:Eastmount  
这篇文章将详细讲解开始图像形态学知识,主要介绍图像腐蚀处理和膨胀处理。文中的示例代码简洁易懂,感兴趣的小伙伴快跟随小编一起学习一下吧

前言

这篇文章将详细讲解开始图像形态学知识,主要介绍图像腐蚀处理和膨胀处理。数学形态学(Mathematical Morphology)是一种应用于图像处理和模式识别领域的新方法。数学形态学(也称图像代数)表示以形态为基础对图像进行分析的数学工具,其基本思想是用具有一定形态的结构元素去量度和提取图像中对应形状以达到对图像分析和识别的目的。

一.形态学理论知识

数学形态学的应用可以简化图像数据,保持它们基本的形状特征,并出去不相干的结构。数学形态学的算法有天然的并行实现的结构,主要针对的是二值图像(0或1)。在图像处理方面,二值形态学经常应用到对图像进行分割、细化、抽取骨架、边缘提取、形状分析、角点检测,分水岭算法等。由于其算法简单,算法能够并行运算所以经常应用到硬件中[1-2]。

常见的图像形态学运算包括:

  • 腐蚀
  • 膨胀
  • 开运算
  • 闭运算
  • 梯度运算
  • 顶帽运算
  • 底帽运算

这些运算在OpenCV中主要通过MorphologyEx()函数实现,它能利用基本的膨胀和腐蚀技术,来执行更加高级形态学变换,如开闭运算、形态学梯度、顶帽、黑帽等,也可以实现最基本的图像膨胀和腐蚀。其函数原型如下:

dst = cv2.morphologyEx(src, model, kernel)

– src表示原始图像

– model表示图像进行形态学处理,包括:

(1)cv2.MORPH_OPEN:开运算(Opening Operation)

(2)cv2.MORPH_CLOSE:闭运算(Closing Operation)

(3)cv2.MORPH_GRADIENT:形态学梯度(Morphological Gradient)

(4)cv2.MORPH_TOPHAT:顶帽运算(Top Hat)

(5)cv2.MORPH_BLACKHAT:黑帽运算(Black Hat)

kernel表示卷积核,可以用numpy.ones()函数构建

二.图像腐蚀

图像的腐蚀(Erosion)和膨胀(Dilation)是两种基本的形态学运算,主要用来寻找图像中的极小区域和极大区域。图像腐蚀类似于“领域被蚕食”,它将图像中的高亮区域或白色部分进行缩减细化,其运行结果比原图的高亮区域更小。

设A,B为集合,A被B的腐蚀,记为A-B,其定义为:

该公式表示图像A用卷积模板B来进行腐蚀处理,通过模板B与图像A进行卷积计算,得出B覆盖区域的像素点最小值,并用这个最小值来替代参考点的像素值。如图1所示,将左边的原始图像A腐蚀处理为右边的效果图A-B。

图像腐蚀主要包括二值图像和卷积核两个输入对象,卷积核是腐蚀中的关键数组,采用Numpy库可以生成。卷积核的中心点逐个像素扫描原始图像,被扫描到的原始图像中的像素点,只有当卷积核对应的元素值均为1时,其值才为1,否则将其像素值修改为0。在Python中,主要调用OpenCV的erode()函数实现图像腐蚀。

其函数原型如下:

dst = cv2.erode(src, kernel, iterations)

– src表示原始图像

– kernel表示卷积核

– iterations表示迭代次数,默认值为1,表示进行一次腐蚀操作

可以采用函数numpy.ones((5,5), numpy.uint8)创建5×5的卷积核,如下:

图像腐蚀操作的代码如下所示:

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np  

#读取图片
src = cv2.imread('test01.jpg', cv2.IMREAD_UNCHANGED)

#设置卷积核
kernel = np.ones((5,5), np.uint8)

#图像腐蚀处理
erosion = cv2.erode(src, kernel)

#显示图像
cv2.imshow("src", src)
cv2.imshow("result", erosion)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如图2所示,左边表示原图,右边是腐蚀处理后的图像,可以发现图像中的干扰细线(噪声)被清洗干净。

如果腐蚀之后的图像仍然存在噪声,可以设置迭代次数进行多次腐蚀操作。比如进行9次腐蚀操作的核心代码如下:

erosion = cv2.erode(src, kernel,iterations=9)

最终经过9次腐蚀处理的输出图像如图3所示。

三.图像膨胀

图像膨胀是腐蚀操作的逆操作,类似于“领域扩张”,它将图像中的高亮区域或白色部分进行扩张,其运行结果比原图的高亮区域更大。

设A,B为集合,∅为空集,A被B的膨胀,记为A⊕B,其中⊕为膨胀算子,膨胀定义为:

该公式表示用B来对图像A进行膨胀处理,其中B是一个卷积模板,其形状可以为正方形或圆形,通过模板B与图像A进行卷积计算,扫描图像中的每一个像素点,用模板元素与二值图像元素做“与”运算,如果都为0,那么目标像素点为0,否则为1。从而计算B覆盖区域的像素点最大值,并用该值替换参考点的像素值实现图像膨胀。图4是将左边的原始图像A膨胀处理为右边的效果图A⊕B。

图像被腐蚀处理后,它将去除噪声,但同时会压缩图像,而图像膨胀操作可以去除噪声并保持原有形状,如图5所示。

在Python中,主要调用OpenCV的dilate()函数实现图像腐蚀。函数原型如下:

dst = cv2.dilate(src, kernel, iterations)

– src表示原始图像

– kernel表示卷积核,可以用numpy.ones()函数构建

– iterations表示迭代次数,默认值为1,表示进行一次膨胀操作

图像膨胀操作的代码如下所示:

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np  

#读取图片
src = cv2.imread('zhiwen.png', cv2.IMREAD_UNCHANGED)

#设置卷积核
kernel = np.ones((5,5), np.uint8)

#图像膨胀处理
erosion = cv2.dilate(src, kernel)

#显示图像
cv2.imshow("src", src)
cv2.imshow("result", erosion)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如图6所示:

四.总结

本文主要介绍图像形态学处理,详细讲解了图像腐蚀处理和膨胀处理。数学形态学是一种应用于图像处理和模式识别领域的新方法,其基本思想是用具有一定形态的结构元素去量度和提取图像中对应形状以达到对图像分析和识别目的。

到此这篇关于Python图像运算之腐蚀与膨胀详解的文章就介绍到这了,更多相关Python图像腐蚀 膨胀内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python 使用百度AI接口进行人脸对比的步骤

    python 使用百度AI接口进行人脸对比的步骤

    这篇文章主要介绍了python 使用百度AI接口进行人脸对比的步骤,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-03-03
  • Python基础数据类型tuple元组的概念与用法

    Python基础数据类型tuple元组的概念与用法

    元组(tuple)是 Python 中另一个重要的序列结构,和列表类似,元组也是由一系列按特定顺序排序的元素组成,这篇文章主要给大家介绍了关于Python基础数据类型tuple元组的概念与使用方法,需要的朋友可以参考下
    2021-07-07
  • Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)

    Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)

    这篇文章主要介绍了Python实现常见的几种加密算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • python中怎么表示空值

    python中怎么表示空值

    在本篇内容里小编给大家整理了关于python如何表示空值的知识点内容,有兴趣的朋友们可以跟着学习参考下。
    2020-06-06
  • 使用python模拟命令行终端的示例

    使用python模拟命令行终端的示例

    今天小编就为大家分享一篇使用python模拟命令行终端的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • django 环境变量配置过程详解

    django 环境变量配置过程详解

    这篇文章主要介绍了django 环境变量配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • python图像处理入门(一)

    python图像处理入门(一)

    这篇文章主要介绍了python图像处理入门,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • python-redis-lock实现锁自动续期的源码逻辑

    python-redis-lock实现锁自动续期的源码逻辑

    这篇文章主要介绍了python-redis-lock实现锁自动续期的源码逻辑,其中用到了多线程threading、弱引用weakref和Lua脚本等相关知识,需要的朋友可以参考下
    2024-07-07
  • Python使用getpass库读取密码的示例

    Python使用getpass库读取密码的示例

    本篇文章主要介绍了Python使用getpass库读取密码的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • python中子类继承父类的__init__方法实例

    python中子类继承父类的__init__方法实例

    这篇文章主要给大家详细介绍了python中子类如何继承父类的__init__方法,文中给出了详细的示例代码,相信对大家的理解和学习具有一定参考价值,有需要的朋友们下面来跟着小编一起学习学习吧。
    2016-12-12

最新评论