Cv2.MorphologyEx是形态学处理的终极全能函数!它把腐蚀、膨胀组合成 6 种高级效果,专门解决二值图像的各种缺陷:去噪点、补孔洞、连接断裂、提取轮廓、去除背景、增强线条。你之前学的 Erode(腐蚀)、Dilate(膨胀) 是基础,MorphologyEx 是它们的组合升级版。
MorphologyEx = 腐蚀 + 膨胀 按固定顺序组合 = 6 种高级形态学效果
最常用的 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 |
若文章对您有帮助,可以激励一下我哦,祝您平安幸福!
| 微信 | 支付宝 |
|---|---|
![]() |
![]() |

