跳到主要内容
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、目标分割、轮廓提取、二维码处理等任务之前。

站内引用