一、一句话通俗定义
膨胀属于形态学操作,针对二值图像(黑白图:前景白色物体、黑色背景)。
作用:放大白色前景区域,填充物体内部细小黑洞、连接邻近断开的线条、加粗物体轮廓。
类比:给白色物体 “长胖一圈”。
二、核心基础概念
- 二值图规则
- 前景:255(白色,我们关心的物体)
- 背景:0(黑色)
- 结构元(Kernel / 卷积核) 膨胀、腐蚀都依靠一个小矩阵窗口滑动遍历整张图,这个窗口叫结构元。 常见:3×3 全 1 矩阵、5×5 全 1 矩阵、十字形、圆形核。 核里值全部为 1 代表有效区域。
三、膨胀数学原理
滑动窗口规则:
结构元逐像素滑动到图像每个位置,只要窗口内任意一个像素是白色 (255),窗口中心像素就置为白色。
拆解理解:
- 窗口盖在图像上;
- 扫一遍窗口里所有像素;
- 但凡有一处白 → 中心变白;
- 只有窗口全部是黑,中心才保持黑色。
直观举例:
一条细细的白线,3×3 核膨胀一次:线四周向外拓宽 1 个像素;
两个靠得很近、中间有小黑缝的白色线段,膨胀后白色扩张,缝隙被填满,两条线连在一起。
数学表达式(可选给进阶学员)

⊕:形态学膨胀运算,实质是求局部区域最大值(灰度图通用逻辑)。
灰度图逻辑:窗口内像素取最大值作为中心输出,亮区扩张、暗区收缩。
四、OpenCvSharp 函数原型
public static void Dilate(
InputArray src,
OutputArray dst,
InputArray kernel, // 结构元,null则默认3×3全1核
Point? anchor = null, // 锚点,默认核中心(-1,-1)
int iterations = 1, // 膨胀迭代次数,越大物体越粗
BorderTypes borderType = BorderTypes.BorderConstant,
Scalar? borderValue = null
);
参数逐条讲解(重点)
kernel结构元- 生成方法:
Cv2.GetStructuringElement() - 三种形状:矩形、十字形、椭圆形 / 圆形
// 3×3矩形核 Mat kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(3,3)); // 5×5圆形核,边缘更平滑 Mat kernel circleKer = Cv2.GetStructuringElement(MorphShapes.Ellipse, new Size(5,5));- 生成方法:
anchor锚点 结构元参考中心点,默认-1,-1(核几何中心),几乎不用修改。iterations迭代次数- iterations=1:膨胀 1 圈
- iterations=3:连续膨胀 3 次,物体大幅变粗、小洞完全填充 迭代次数越高,运算耗时越大。
五、完整可运行 OpenCvSharp 示例代码
using OpenCvSharp;
class DilateDemo
{
static void Main()
{
Mat src = Cv2.ImRead("binary.png", ImreadModes.Color);
Mat gray = new Mat();
Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);
// 转二值图(阈值分割,得到黑白前景)
Mat binary = new Mat();
Cv2.Threshold(gray, binary, 127, 255, ThresholdTypes.Binary);
// 创建5×5矩形结构元
Mat kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(5, 5));
Mat dilateDst = new Mat();
// 膨胀,迭代2次
Cv2.Dilate(binary, dilateDst, kernel, null, 2);
Cv2.ImShow("原图二值", binary);
Cv2.ImShow("膨胀结果", dilateDst);
Cv2.WaitKey(0);
kernel.Dispose();
}
}
六、膨胀带来的 3 个直观效果(课堂演示必看)
- 白色物体加粗、变大 细线变粗、小点变大块、文字笔画变粗。
- 填充物体内部小黑孔洞 物体内部微小黑色缝隙、噪点小孔,膨胀后被白色填满。
- 近距离断开物体连通 两个间隔很小的白色轮廓,膨胀扩张后互相连接,合并成一整块。
七、膨胀 vs 腐蚀 Erode(课堂对比,学员极易混淆)
表格
| 操作 | 核心逻辑 | 对白色前景影响 | 典型效果 |
|---|---|---|---|
| Dilate 膨胀 | 窗口有白则中心变白(取最大值) | 放大、长胖 | 填小孔、连线、加粗 |
| Erode 腐蚀 | 窗口全白中心才变白(取最小值) | 缩小、变瘦 | 去除小白噪点、分割粘连物体 |
记忆口诀:膨胀长胖,腐蚀变瘦。
八、讲师专用:膨胀真实业务应用场景(工业视觉重点)
- OCR 文字增强 拍摄的文字笔画纤细、有断笔,膨胀加粗文字,方便字符识别;条码、二维码破损断线修复。
- 缺陷检测:填补产品内部微小暗斑 金属零件反光造成内部小黑洞,膨胀消除孔洞,方便完整提取零件轮廓。
- 轮廓合并 工件表面分散的划痕、裂纹是多处小白点,膨胀后连成完整线条,统计缺陷总长。
- 形态学开闭运算配套
- 开运算:先腐蚀→后膨胀(去小白噪点,物体大小基本不变)
- 闭运算:先膨胀→后腐蚀(填内部小黑洞,物体大小基本不变) 膨胀是闭运算核心步骤。
- 目标区域掩码扩张 抠图得到物体掩码后,膨胀扩大掩码范围,用于图像修复、区域填充。
九、常见踩坑点(讲课重点提醒学员)
- 直接对彩色图膨胀 形态学操作推荐先灰度 + 二值化;彩色图膨胀会分别对 BGR 三通道运算,效果混乱。
- 迭代次数过大 物体过度膨胀,相邻无关物体错误粘连,丢失原始轮廓尺寸。
- 核尺寸不合理 细小缝隙用 3×3;大孔洞填充用 7×7/9×9 大核,核越大膨胀扩张范围越大。
- 前景背景颠倒 如果图像物体是黑色、背景白色,膨胀会扩大黑色区域,效果完全相反;务必保证目标物体为白色 255。
十、课堂互动问答(加深记忆)
- 一张二值图里白色文字笔画有很多断点,用膨胀还是腐蚀修复? 答:膨胀,白色扩张,填补断口。
- 两个间距 2 像素的白色方块,3×3 核膨胀一次会发生什么? 答:白色向外扩张 1 像素,方块边缘相连,合并成一块。
- 闭运算为什么需要膨胀? 答:先用膨胀填充物体内部黑色小孔,再腐蚀还原物体原有大小。
十一、课堂精简总结话术
- 膨胀是形态学基础操作,原理:结构元滑动,区域取最大值;
- 效果:白色前景向外扩张,加粗物体、填充内部黑洞、连接近距离断开区域;
- 核心参数:结构元大小形状、迭代次数,控制膨胀幅度;
- 常配合腐蚀组成开 / 闭运算,广泛用于条码、OCR、工业缺陷检测、掩码处理。
若文章对您有帮助,可以激励一下我哦,祝您平安幸福!
| 微信 | 支付宝 |
|---|---|
![]() |
![]() |

