Opencv(五): 腐蚀和膨胀
文章目录
- 前言
- 一、形态学变换的基本概念
- 1. 什么是形态学变换
- 2. 为什么要进行形态学处理
- 二、结构元素(核)的定义与作用
- 1. 什么是结构元素
- 2. 核的选取原则
- 三、腐蚀(Erosion)
- 1. 腐蚀的原理
- 2. 实验效果
- 3. Python 实现
- 四、膨胀(Dilation)
- 1. 膨胀的原理
- 2. 效果分析
- 3. Python 实现
- 五、开运算与闭运算
- 1. 开运算(Opening)
- 2. 闭运算(Closing)
- 六、形态学操作的实验流程
- Step 1:读取图像并灰度化、二值化
- Step 2:定义核
- Step 3:执行不同形态学操作
- Step 4:展示结果
- 七、参数与结构对结果的影响
- 八、实验现象与分析
- 九、形态学变换的应用场景
- 十、总结
前言
在图像处理领域中,“形态学变换(Morphological Transformations)” 是一类基于图像形状结构的处理方法,广泛应用于目标检测、图像分割、边缘提取、噪声去除等任务中。与传统的灰度或频域操作不同,形态学主要针对二值化图像进行几何结构的分析与修改。本文将从理论到实践,系统地讲解形态学的基本原理、常见操作以及 Python 实现方法。
一、形态学变换的基本概念
1. 什么是形态学变换
形态学变换是基于集合论和数学形态学理论的一种图像处理方式,其核心思想是通过一个被称为**结构元素(Structuring Element)**的核(kernel)在图像上滑动,对目标的形状进行分析和修改。简单来说,它可以“扩张”、“收缩”图像中的白色区域,从而实现去噪、填洞、提取边缘等效果。
形态学操作最初是为了解析二值图像而提出的,但在现代图像处理中,也被广泛用于灰度图像的结构分析。
2. 为什么要进行形态学处理
在实际图像中,往往会因为光照变化、噪声干扰等原因导致二值图像出现断裂、毛刺或孔洞。此时,形态学操作可以有效地“修复”图像形态。例如:
- 腐蚀可以去除细小的噪声;
- 膨胀可以填补物体内部的空洞;
- 开运算可以去除孤立点;
- 闭运算可以连接断裂的边缘。
这些操作让图像在后续的目标识别或特征提取中更加干净、完整。
二、结构元素(核)的定义与作用
1. 什么是结构元素
结构元素可以理解为一个小窗口,在图像上滑动并与图像局部区域进行比较。常见的结构元素形状包括:
- 矩形核(Rectangular kernel)
- 椭圆核(Elliptical kernel)
- 十字形核(Cross kernel)
核的大小通常为 3×3、5×5、7×7 等奇数矩阵。核越大,形态学操作的“影响范围”越广,结果变化越明显。
2. 核的选取原则
- 如果目标物体呈规则形状(如矩形、圆形),可选择对应形状的核;
- 若想保留较细节的边缘,建议选择较小的核;
- 若目标被噪声干扰严重,可使用较大的核来平滑结构。
在 OpenCV 中,我们可以通过 cv2.getStructuringElement() 函数生成结构元素:
import cv2
import numpy as np# 创建不同形状的结构元素
kernel_rect = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
kernel_ellipse = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))
kernel_cross = cv2.getStructuringElement(cv2.MORPH_CROSS, (5,5))
三、腐蚀(Erosion)
1. 腐蚀的原理
腐蚀操作的含义是“侵蚀”或“缩小”白色区域。它会使前景物体的边界向内收缩,从而达到去除细小噪声或断开粘连物体的效果。
在数学上,腐蚀可以表示为:

其中,A 表示原始图像,B 表示结构元素。
通俗理解:核在图像上滑动时,只有当核所覆盖的区域全部为白色(255)时,中心像素才保持白色,否则变为黑色。
2. 实验效果
原图(Binary) → 腐蚀后:
- 亮区域(白色)被“吃掉”,边界收缩;
- 小的白点噪声被完全去除;
- 图像结构变得更加“瘦”。
3. Python 实现
import cv2if __name__ == "__main__":path = "./test.png"image_np = cv2.imread(path)image_np_gray = cv2.cvtColor(image_np, cv2.COLOR_BGR2GRAY) # 转为灰度图ret, image_np_thresh = cv2.threshold(image_np_gray, 127, 255, cv2.THRESH_BINARY) # 进行二值化# 形态学操作kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))morph_images = cv2.erode(image_np_thresh, kernel)# 返回处理正确后的内容cv2.imshow("morph_images", morph_images)cv2.waitKey(0)
输出结果为:
原图像为:

腐蚀后为:

参数解释:
iterations表示腐蚀的次数;- 次数越多,腐蚀程度越深。
四、膨胀(Dilation)
1. 膨胀的原理
膨胀与腐蚀相反,是一种扩张白色区域的操作。当核覆盖区域内只要有一个白色像素(255),中心像素就会被设为白色。这会导致前景物体“变胖”,并且可以填补孔洞或连接断裂区域。
公式表示为:

2. 效果分析
膨胀可以让细线变粗,让断裂的部分连接起来,但也可能导致相邻物体粘连。
3. Python 实现
import cv2if __name__ == "__main__":path = "./test.png"image_np = cv2.imread(path)image_np_gray = cv2.cvtColor(image_np, cv2.COLOR_BGR2GRAY) # 转为灰度图ret, image_np_thresh = cv2.threshold(image_np_gray, 127, 255, cv2.THRESH_BINARY) # 进行二值化# 形态学操作kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))morph_images = cv2.dilate(image_np_thresh, kernel)# 返回处理正确后的内容cv2.imshow("morph_images", morph_images)cv2.waitKey(0)
输出结果为:
原图像还是不变

五、开运算与闭运算
1. 开运算(Opening)
开运算 = 先腐蚀再膨胀
其主要功能是去除噪声,保留主要结构。
opened = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
应用:用于消除小型白点噪声而不影响整体结构。
2. 闭运算(Closing)
闭运算 = 先膨胀再腐蚀
它的主要功能是填补物体内部的小孔或连接细小断裂。
closed = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
应用:可平滑物体边缘、修复断裂区域。
六、形态学操作的实验流程
下面以一个简单实验为例,展示完整的处理步骤。
Step 1:读取图像并灰度化、二值化
img = cv2.imread('demo.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
Step 2:定义核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
Step 3:执行不同形态学操作
erosion = cv2.erode(binary, kernel)
dilation = cv2.dilate(binary, kernel)
opening = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)
Step 4:展示结果
cv2.imshow('Original', binary)
cv2.imshow('Erosion', erosion)
cv2.imshow('Dilation', dilation)
cv2.imshow('Opening', opening)
cv2.imshow('Closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()
七、参数与结构对结果的影响
通过调整核的大小、形状和迭代次数,可以显著改变结果。例如:
| 核大小 | 腐蚀效果 | 膨胀效果 |
|---|---|---|
| 3×3 | 边缘轻微收缩 | 轻微扩张 |
| 5×5 | 明显收缩 | 明显扩张 |
| 7×7 | 丢失细节 | 容易粘连 |
核形状的选择也很关键:
- 矩形核:通用型,适合大多数目标;
- 椭圆核:平滑边缘;
- 十字核:保留线条状结构。
八、实验现象与分析
通过对比腐蚀、膨胀、开运算、闭运算的结果,我们可以观察到:
- 腐蚀使目标“变瘦”,噪声减少;
- 膨胀让目标“变胖”,填补空洞;
- 开运算去除孤立白点;
- 闭运算修复断裂边缘;
- 当核尺寸过大时,细节损失严重;
- 适当调整迭代次数,可以平衡噪声抑制与形态保留。
实验中常见的问题:
- 若二值化阈值过低,形态学操作会放大噪声;
- 若图像边缘过细,腐蚀后可能导致目标断裂;
- 若核过大,膨胀后目标容易粘连。
九、形态学变换的应用场景
形态学操作是许多图像分析任务的“前置清洗”步骤:
-
噪声去除
开运算常用于消除小白点或孤立噪声。 -
边缘提取
通过膨胀与腐蚀的差值可以提取目标边缘:edge = cv2.absdiff(cv2.dilate(binary, kernel), cv2.erode(binary, kernel)) -
目标分割
在分水岭算法、连通域分析前,通过形态学变换可提升目标的连贯性。 -
OCR 预处理
对文本图像进行闭运算,可有效连接断裂的笔画,提升识别率。 -
车道线检测、医学影像分析
形态学操作在细线提取、组织边界识别等任务中都发挥重要作用。
十、总结
形态学变换是图像处理中的重要基础工具,它以结构化的方式从几何形态层面修正图像。腐蚀、膨胀、开闭运算等基本操作的组合,为各种视觉算法提供了强大的支持。在实际工程中,熟练掌握这些操作及其参数调节方法,能够显著提升图像质量与识别效果。
