2026-08-14 · 一段与 batype 的对话(AI) · 由提问者公开
什么是膨胀腐蚀算法?
回答由 AI 基于 batype 的笔记生成,不代表本人实时观点。
什么是膨胀腐蚀算法?
膨胀(Dilation)和腐蚀(Erosion)是**图像形态学(Mathematical Morphology)**里的基础算法,主要处理二值图像,也常用于灰度图像。它们通过一个小矩阵——结构元素(kernel / structuring element)——扫描图像,改变前景区域的边界形状。
约定:二值图像中白色(1)为前景,黑色(0)为背景。
1. 膨胀:让前景“变胖”
膨胀会扩展白色区域:
- 填补前景内部的小孔洞、断裂;
- 连接距离很近的物体;
- 让目标轮廓向外扩张。
对每个像素,查看其结构元素覆盖的邻域:只要邻域中存在一个前景像素,输出就是前景。
原图 3×3 结构元素膨胀后
0 0 0 1 1 1
0 1 0 → 1 1 1
0 0 0 1 1 1
在 OpenCV 中:
import cv2
import numpy as np
image = cv2.imread("binary.png", cv2.IMREAD_GRAYSCALE)
kernel = np.ones((3, 3), np.uint8)
dilated = cv2.dilate(image, kernel, iterations=1)
cv2.imwrite("dilated.png", dilated)
2. 腐蚀:让前景“变瘦”
腐蚀会收缩白色区域:
- 去掉小的白色噪点;
- 断开彼此粘连的物体;
- 去除目标边缘的细小突出部分。
对每个像素,只有当结构元素覆盖的邻域全部都是前景像素时,输出才是前景。
原图 3×3 结构元素腐蚀后
1 1 1 0 0 0
1 1 1 → 0 1 0
1 1 1 0 0 0
OpenCV 示例:
import cv2
import numpy as np
image = cv2.imread("binary.png", cv2.IMREAD_GRAYSCALE)
kernel = np.ones((3, 3), np.uint8)
eroded = cv2.erode(image, kernel, iterations=1)
cv2.imwrite("eroded.png", eroded)
3. 结构元素决定效果
常见的结构元素如下:
# 方形:各方向均匀处理
kernel = np.ones((3, 3), np.uint8)
# 十字形:更强调上下左右方向
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))
# 椭圆形:边界通常更平滑
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
kernel 越大,膨胀或腐蚀的效果越强;iterations 越多,效果也会累积。
4. 两个常见组合
开运算(Opening):先腐蚀,再膨胀
用于消除小的前景噪点,同时尽量保留大目标。
opened = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)
例如:一张黑底白字图片有零散白点,先腐蚀去掉白点,再膨胀恢复文字主体。
闭运算(Closing):先膨胀,再腐蚀
用于填补前景中的小黑洞,或连接接近但有缝隙的区域。
closed = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)
例如:OCR 前处理时,文字笔画有轻微断裂,可以先做闭运算。
可以把它们简单记成:
| 操作 | 前景变化 | 常见用途 |
|---|---|---|
| 膨胀 | 变大、变粗 | 连通断裂区域、填小洞 |
| 腐蚀 | 变小、变细 | 去小噪点、分离粘连区域 |
| 开运算 | 去白色小噪点 | 噪声清理 |
| 闭运算 | 填黑色小孔、连缝隙 | 修补断裂目标 |
它们不是“识别”算法,而是图像预处理手段,常用在 OCR、目标分割、轮廓提取、二维码处理等任务之前。
站内引用