Opencv中文网

高级形态学:开闭运算/顶帽/黑帽/形态梯度(MorphologyEx)

Cv2.MorphologyEx形态学处理的终极全能函数!它把腐蚀、膨胀组合成 6 种高级效果,专门解决二值图像的各种缺陷:去噪点、补孔洞、连接断裂、提取轮廓、去除背景、增强线条。你之前学的 Erode(腐蚀)、Dilate(膨胀) 是基础,MorphologyEx 是它们的组合升级版

MorphologyEx = 腐蚀 + 膨胀 按固定顺序组合 = 6 种高级形态学效果

最常用的 4 个功能:

  1. 开运算 → 去白色噪点(先腐蚀,后膨胀)
  2. 闭运算 → 去黑色孔洞(先膨胀,后腐蚀)
  3. 形态学梯度 → 提取物体轮廓 / 边缘
  4. 顶帽 / 黑帽增强暗 / 亮区域、去除不均匀背景

函数原型(C# OpenCVSharp)

void MorphologyEx(
    InputArray src,            // 输入图像(二值图最佳)
    OutputArray dst,           // 输出图像
    MorphTypes op,             // 形态学操作类型(核心!)
    InputArray kernel,         // 结构元素(核)
    Point? anchor = null,      // 锚点,默认中心
    int iterations = 1,        // 迭代次数
    BorderTypes borderType = BorderTypes.Default,
    Scalar? borderValue = null
);

1. op(最重要:操作类型)

MorphTypes 枚举,共 6 种,每个对应一种组合效果:

表格

操作类型名称计算逻辑作用
MorphTypes.Open开运算腐蚀 → 膨胀去除小白点、毛刺、细线
MorphTypes.Close闭运算膨胀 → 腐蚀填补小黑洞、缺口、断裂
MorphTypes.Gradient形态学梯度膨胀 − 腐蚀提取轮廓、边缘
MorphTypes.TopHat顶帽原图 − 开运算增强亮区域、提取小字 / 细线
MorphTypes.BlackHat黑帽闭运算 − 原图增强暗区域、提取黑点

2. kernel(结构元素)

和腐蚀膨胀一样,必须用下面的方法创建:

Mat kernel = Cv2.GetStructuringElement(
    MorphShapes.Rect,    // 矩形(最常用)/椭圆/十字
    new Size(3, 3)       // 核大小:3x3 / 5x5 / 7x7...
);

核越大 → 处理效果越强。

6 种形态学操作 超清晰讲解

1)开运算 OPEN(最常用:去白色噪点)

公式:先腐蚀 → 后膨胀

  • 去掉小的白色噪点、毛刺
  • 不改变主体大小
  • 适合:去噪、分离物体、清理边缘
Cv2.MorphologyEx(src, dst, MorphTypes.Open, kernel);

2)闭运算 CLOSE(最常用:补黑色孔洞)

公式:先膨胀 → 后腐蚀

  • 填补白色物体里的小洞、缺口
  • 连接断裂的文字 / 线条
  • 适合:修补文字、补洞
Cv2.MorphologyEx(src, dst, MorphTypes.Close, kernel);

3)形态学梯度 GRADIENT(提取轮廓)

公式:膨胀 − 腐蚀

  • 得到物体外围轮廓
  • 不依赖 Canny,纯形态学边缘提取
Cv2.MorphologyEx(src, dst, MorphTypes.Gradient, kernel);

4)顶帽 TOPHAT(提取亮细线 / 小字)

公式:原图 − 开运算

  • 提取图像中小而亮的区域
  • 去除不均匀背景,突出文字 / 细线

用途:

  • 文字识别
  • 低光图像增强
  • 去除阴影背景

5)黑帽 BLACKHAT(提取暗点 / 小字)

公式:闭运算 − 原图

  • 提取图像中小而暗的区域
  • 突出黑色文字 / 黑点

6)HITMISS(击中击不中)

用于模板匹配,极少用,可忽略。

六、最实用完整代码(直接复制运行)

using OpenCVSharp;

class Program
{
    static void Main()
    {
        // 1. 读取 → 灰度 → 二值化
        Mat src = Cv2.ImRead("test.jpg", ImreadModes.Color);
        Mat gray = new Mat();
        Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);

        Mat binary = new Mat();
        Cv2.Threshold(gray, binary, 0, 255, 
            ThresholdTypes.Binary | ThresholdTypes.Otsu);

        // 2. 创建核
        Mat kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(3, 3));

        Mat result = new Mat();

        // 3. 开运算:去白色噪点
        Cv2.MorphologyEx(binary, result, MorphTypes.Open, kernel);

        // 4. 闭运算:补孔洞
        // Cv2.MorphologyEx(binary, result, MorphTypes.Close, kernel);

        // 保存
        Cv2.ImWrite("result.png", result);
    }
}

最强总结:什么时候用哪种?

表格

你的问题用哪个操作
图片有小白噪点开运算 OPEN
文字断裂、有小洞闭运算 CLOSE
提取物体轮廓梯度 GRADIENT
增强亮文字 / 细线顶帽 TOPHAT
增强暗文字 / 黑点黑帽 BLACKHAT

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