写点什么

Python 从 0 到 1 丨图像增强及运算:形态学开运算、闭运算和梯度运算

  • 2023-02-10
    中国香港
  • 本文字数:2132 字

    阅读完需:约 7 分钟

Python从0到1丨图像增强及运算:形态学开运算、闭运算和梯度运算

本文分享自华为云社区《[Python从零到壹] 四十八.图像增强及运算篇之形态学开运算、闭运算和梯度运算》,作者: eastmount 。


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

一.图像开运算


开运算一般能平滑图像的轮廓,削弱狭窄部分,去掉较细的突出。闭运算也是平滑图像的轮廓,与开运算相反,它一般熔合窄的缺口和细长的弯口,去掉小洞,填补轮廓上的缝隙。图像开运算是图像依次经过腐蚀、膨胀处理的过程,图像被腐蚀后将去除噪声,但同时也压缩了图像,接着对腐蚀过的图像进行膨胀处理,可以在保留原有图像的基础上去除噪声。其原理如图 1 所示。



设 A 是原始图像,B 是结构元素图像,则集合 A 被结构元素 B 做开运算,记为 A◦B,其定义为:



换句话说,A 被 B 开运算就是 A 被 B 腐蚀后的结果再被 B 膨胀。图像开运算在 OpenCV 中主要使用函数 morphologyEx(),它是形态学扩展的一组函数,其函数原型如下:


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


  • src 表示原始图像

  • cv2.MORPH_OPEN 表示图像进行开运算处理

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


图像开运算的代码如下所示:


# -*- coding: utf-8 -*-# By:Eastmountimport cv2  import numpy as np  
#读取图片src = cv2.imread('test01.png', cv2.IMREAD_UNCHANGED)
#设置卷积核kernel = np.ones((5,5), np.uint8)
#图像开运算result = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)
#显示图像cv2.imshow("src", src)cv2.imshow("result", result)
#等待显示cv2.waitKey(0)cv2.destroyAllWindows()
复制代码


输出结果如图 2 所示,左边为原始图像,右边为处理后的图像,可以看到原始图形中的噪声点被去除了部分。



但处理后的图像中仍然有部分噪声,如果想更彻底地去除,可以将卷积设置为 10×10 的模板,代码如下所示:


# -*- coding: utf-8 -*-# By:Eastmountimport cv2  import numpy as np  
#读取图片src = cv2.imread('test01.png', cv2.IMREAD_UNCHANGED)
#设置卷积核kernel = np.ones((10,10), np.uint8)
#图像开运算result = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)
#显示图像cv2.imshow("src", src)cv2.imshow("result", result)
#等待显示cv2.waitKey(0)cv2.destroyAllWindows()
复制代码


运行结果如图 3 所示:


二.图像闭运算


图像闭运算是图像依次经过膨胀、腐蚀处理的过程,先膨胀后腐蚀有助于过滤前景物体内部的小孔或物体上的小黑点。其原理如图 4 所示:



设 A 是原始图像,B 是结构元素图像,则集合 A 被结构元素 B 做开运算,记为 A·B,其定义为:



换句话说,A 被 B 闭运算就是 A 被 B 膨胀后的结果再被 B 腐蚀。图像开运算在 OpenCV 中主要使用函数 morphologyEx(),其函数原型如下:


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


  • src 表示原始图像

  • cv2.MORPH_CLOSE 表示图像进行闭运算处理

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


图像开运算的代码如下所示:


# -*- coding: utf-8 -*-# By:Eastmountimport cv2  import numpy as np  
#读取图片src = cv2.imread('test02.png', cv2.IMREAD_UNCHANGED)
#设置卷积核kernel = np.ones((10,10), np.uint8)
#图像闭运算result = cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel)
#显示图像cv2.imshow("src", src)cv2.imshow("result", result)
#等待显示cv2.waitKey(0)cv2.destroyAllWindows()
复制代码


输出结果如图 5 所示,它有效地去除了图像中间的小黑点(噪声)。


三.图像梯度运算


图像梯度运算是图像膨胀处理减去图像腐蚀处理后的结果,从而得到图像的轮廓,其原理如图 6 所示,(a)表示原始图像,(b)表示膨胀处理后的图像,(c)表示腐蚀处理后的图像,(d)表示图像梯度运算的效果图。



在 Python 中,图像梯度运算主要调用 morphologyEx()实现,其中参数 cv2.MORPH_GRADIENT 表示梯度处理,函数原型如下:


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


  • src 表示原始图像

  • cv2.MORPH_GRADIENT 表示图像进行梯度运算处理

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


图像梯度运算的实现代码如下所示。


# -*- coding: utf-8 -*-import cv2  import numpy as np  
#读取图片src = cv2.imread('test03.png', cv2.IMREAD_UNCHANGED)
#设置卷积核kernel = np.ones((10,10), np.uint8)
#图像梯度运算result = cv2.morphologyEx(src, cv2.MORPH_GRADIENT, kernel)
#显示图像cv2.imshow("src", src)cv2.imshow("result", result)
#等待显示cv2.waitKey(0)cv2.destroyAllWindows()
复制代码


图像梯度运算处理的结果如图 7 所示,左边为原始图像,右边为处理后的效果图。



参考文献:


  • [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.


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

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

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

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

评论

发布
暂无评论
Python从0到1丨图像增强及运算:形态学开运算、闭运算和梯度运算_Python_华为云开发者联盟_InfoQ写作社区