Python OpenCV图像形态学:腐蚀与膨胀详解

叶初
叶初
发布时间:2026-10-15 | 4人浏览过
原创

本文深入解析Python OpenCV中的图像形态学处理,重点讲解腐蚀与膨胀两种基本运算。通过数学定义、函数原型及代码示例,详细说明如何利用卷积核对图像进行去噪、细化或扩张操作,并介绍开闭运算等高级形态学变换的实现方法。

前言

本文旨在系统讲解图像形态学的基础知识,核心内容涵盖图像的腐蚀处理与膨胀处理。数学形态学(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()函数来实现图像膨胀(注:原文此处文字描述为腐蚀,但函数名为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 相关产品和应用

全部下载

专题列表