写点什么

Python 从 0 到 1 丨了解图像形态学运算中腐蚀和膨胀

  • 2023-05-24
    广东
  • 本文字数:2287 字

    阅读完需:约 8 分钟

Python从0到1丨了解图像形态学运算中腐蚀和膨胀

本文分享自华为云社区《[Python从零到壹] 四十七.图像增强及运算篇之腐蚀和膨胀详解》,作者: eastmount 。

一.形态学理论知识


数学形态学的应用可以简化图像数据,保持它们基本的形状特征,并出去不相干的结构。数学形态学的算法有天然的并行实现的结构,主要针对的是二值图像(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:Eastmountimport 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:Eastmountimport 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 所示:


四.总结


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


参考文献:


  • [1]冈萨雷斯著,阮秋琦译. 数字图像处理(第 3 版)[M]. 北京:电子工业出版社,2013.

  • [2]阮秋琦. 数字图像处理学(第 3 版)[M]. 北京:电子工业出版社,2008.

  • [3]毛星云,冷雪飞. OpenCV3 编程入门[M]. 北京:电子工业出版社,2015.

  • [4]Eastmount. [Python 图像处理] 八.图像腐蚀与图像膨胀[EB/OL]. (2018-10-31). https://blog.csdn.net/Eastmount/article/details/83581277.


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 4
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
Python从0到1丨了解图像形态学运算中腐蚀和膨胀_Python_华为云开发者联盟_InfoQ写作社区