Opencv中文网

膨胀(Dilate)

一、一句话通俗定义

膨胀属于形态学操作,针对二值图像(黑白图:前景白色物体、黑色背景)。

作用:放大白色前景区域,填充物体内部细小黑洞、连接邻近断开的线条、加粗物体轮廓

类比:给白色物体 “长胖一圈”。

二、核心基础概念

  1. 二值图规则
    • 前景:255(白色,我们关心的物体)
    • 背景:0(黑色)
  2. 结构元(Kernel / 卷积核) 膨胀、腐蚀都依靠一个小矩阵窗口滑动遍历整张图,这个窗口叫结构元。 常见:3×3 全 1 矩阵、5×5 全 1 矩阵、十字形、圆形核。 核里值全部为 1 代表有效区域。

三、膨胀数学原理

滑动窗口规则:

结构元逐像素滑动到图像每个位置,只要窗口内任意一个像素是白色 (255),窗口中心像素就置为白色

拆解理解:

  1. 窗口盖在图像上;
  2. 扫一遍窗口里所有像素;
  3. 但凡有一处白 → 中心变白;
  4. 只有窗口全部是黑,中心才保持黑色。

直观举例:

一条细细的白线,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
);

参数逐条讲解(重点)

  1. kernel 结构元
    • 生成方法:Cv2.GetStructuringElement()
    • 三种形状:矩形、十字形、椭圆形 / 圆形
    csharp运行// 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));
  2. anchor 锚点 结构元参考中心点,默认 -1,-1(核几何中心),几乎不用修改。
  3. 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 个直观效果(课堂演示必看)

  1. 白色物体加粗、变大 细线变粗、小点变大块、文字笔画变粗。
  2. 填充物体内部小黑孔洞 物体内部微小黑色缝隙、噪点小孔,膨胀后被白色填满。
  3. 近距离断开物体连通 两个间隔很小的白色轮廓,膨胀扩张后互相连接,合并成一整块。

七、膨胀 vs 腐蚀 Erode(课堂对比,学员极易混淆)

表格

操作核心逻辑对白色前景影响典型效果
Dilate 膨胀窗口有白则中心变白(取最大值)放大、长胖填小孔、连线、加粗
Erode 腐蚀窗口全白中心才变白(取最小值)缩小、变瘦去除小白噪点、分割粘连物体

记忆口诀:膨胀长胖,腐蚀变瘦

八、讲师专用:膨胀真实业务应用场景(工业视觉重点)

  1. OCR 文字增强 拍摄的文字笔画纤细、有断笔,膨胀加粗文字,方便字符识别;条码、二维码破损断线修复。
  2. 缺陷检测:填补产品内部微小暗斑 金属零件反光造成内部小黑洞,膨胀消除孔洞,方便完整提取零件轮廓。
  3. 轮廓合并 工件表面分散的划痕、裂纹是多处小白点,膨胀后连成完整线条,统计缺陷总长。
  4. 形态学开闭运算配套
    • 开运算:先腐蚀→后膨胀(去小白噪点,物体大小基本不变)
    • 闭运算:先膨胀→后腐蚀(填内部小黑洞,物体大小基本不变) 膨胀是闭运算核心步骤。
  5. 目标区域掩码扩张 抠图得到物体掩码后,膨胀扩大掩码范围,用于图像修复、区域填充。

九、常见踩坑点(讲课重点提醒学员)

  1. 直接对彩色图膨胀 形态学操作推荐先灰度 + 二值化;彩色图膨胀会分别对 BGR 三通道运算,效果混乱。
  2. 迭代次数过大 物体过度膨胀,相邻无关物体错误粘连,丢失原始轮廓尺寸。
  3. 核尺寸不合理 细小缝隙用 3×3;大孔洞填充用 7×7/9×9 大核,核越大膨胀扩张范围越大。
  4. 前景背景颠倒 如果图像物体是黑色、背景白色,膨胀会扩大黑色区域,效果完全相反;务必保证目标物体为白色 255。

十、课堂互动问答(加深记忆)

  1. 一张二值图里白色文字笔画有很多断点,用膨胀还是腐蚀修复? 答:膨胀,白色扩张,填补断口。
  2. 两个间距 2 像素的白色方块,3×3 核膨胀一次会发生什么? 答:白色向外扩张 1 像素,方块边缘相连,合并成一块。
  3. 闭运算为什么需要膨胀? 答:先用膨胀填充物体内部黑色小孔,再腐蚀还原物体原有大小。

十一、课堂精简总结话术

  1. 膨胀是形态学基础操作,原理:结构元滑动,区域取最大值;
  2. 效果:白色前景向外扩张,加粗物体、填充内部黑洞、连接近距离断开区域;
  3. 核心参数:结构元大小形状、迭代次数,控制膨胀幅度;
  4. 常配合腐蚀组成开 / 闭运算,广泛用于条码、OCR、工业缺陷检测、掩码处理。

copyright @重庆教主 WPF中文网 联系站长:(QQ)23611316 (微信)movieclip (QQ群).NET小白课堂:864486030 | 本文由WPF中文网原创发布,谢绝转载 渝ICP备2023009518号-1