详解Python图像形态学处理(开运算,闭运算,梯度运算)

程一诺
程一诺
发布时间:2026-10-15| 3人浏览过
原创

本文深入解析Python中基于OpenCV的图像形态学处理技术,详细讲解开运算、闭运算及梯度运算的原理与实现。通过结构元素对图像进行腐蚀与膨胀操作,实现去噪、轮廓提取及孔洞填充。文中提供具体代码示例与参数说明,帮助开发者掌握图像预处理核心技巧。

本文继续探讨图像形态学中的开运算、闭运算以及梯度运算。数学形态学是图像处理与模式识别领域的重要分析方法,其核心思想是利用具有特定几何形状的结构元素,对图像进行量度与提取,从而实现对图像形状的分析与识别。

一、图像开运算

开运算能够有效平滑图像轮廓,削弱狭窄区域并去除细小的突出部分。与之相对的闭运算同样用于平滑轮廓,但其作用相反,主要融合狭窄缺口和细长弯口,填充小孔洞并修补轮廓缝隙。开运算的执行流程是先对图像进行腐蚀操作以去除噪声(尽管这会压缩图像尺寸),随后进行膨胀处理,从而在保留原始图像主体特征的同时有效去除噪声。具体原理参考图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:Eastmount
import 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:Eastmount
import 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:Eastmount
import 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所示,左侧为原始图像,右侧为梯度运算后的效果图。

四、总结

本文主要介绍了图像形态学处理技术,详细阐述了图像开运算、闭运算及梯度运算。数学形态学作为图像处理与模式识别领域的新方法,其基本思想是利用具有一定形态的结构元素对图像进行量度和提取,从而实现对图像形状的分析与识别。

至此,关于详解Python图像形态学处理(开运算,闭运算,梯度运算)的介绍结束。如需了解更多Python图像形态学处理相关内容,请搜索本站往期文章或继续浏览后续文章。感谢大家的支持!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。