97 个 OpenCV 实例(九):形态学操作,腐蚀膨胀与开闭运算

上一篇讲边缘检测,用一阶导和二阶导「找」边缘。这一篇换个角度,讲怎么「修」形状------形态学操作。它是图像处理里处理形状的一类算子,去噪点、补漏洞、断粘连、提轮廓,全是它的活。工业视觉里,形态学几乎是每个分割流程的前置步骤,值得单独吃透。

一、效果先行

先看两张对比图。

第一张演示「结构元素」的形状影响。同一张图,同样做一次膨胀,但分别用矩形、椭圆、十字、菱形四种结构元素,结果的形状走向明显不同:

第二张是形态学操作全家桶。原图加上七种操作:腐蚀、膨胀、开运算、闭运算、梯度、顶帽、黑帽,排成 2x4 网格一次看全:

两张图看完先记住一句话:形态学的核心是「结构元素」,操作本身只有两个基本动作------腐蚀和膨胀,其余全是它们的组合。

二、形态学是什么:结构元素在图像上滑动

形态学这个名字听着玄,其实思路特别朴素:拿一个小形状(叫结构元素),在图像上一点点滑动,每到一个位置就对这个区域做一次局部运算。

关键就是这个「结构元素」(structuring element)。它是一个小矩阵,形状可以是矩形、椭圆、十字、菱形,尺寸可大可小。它决定了后续操作会「朝什么方向、以什么尺度」影响图像。

OpenCV 里用 getStructuringElement 创建它:

cpp 复制代码
Mat elem = getStructuringElement(MORPH_RECT, Size(15, 15));
// 形状:MORPH_RECT 矩形 / MORPH_ELLIPSE 椭圆 / MORPH_CROSS 十字 / MORPH_DIAMOND 菱形

对比图一里,同样一次膨胀,矩形结构元素的结果是方正的边缘,椭圆是圆滑的,十字和菱形各有各的走向。这就是结构元素的价值------它把「形状」这个维度显式地暴露给你控制。

三、腐蚀与膨胀:一对相反的操作

两个基本操作,方向正好相反:

  • 腐蚀(erode) :结构元素扫过,取覆盖区域的最小值。亮的地方收缩、暗的地方扩张------结果是白色噪点被吃掉、粘连的物体被断开;
  • 膨胀(dilate) :取覆盖区域的最大值。亮的地方扩张、暗的地方收缩------结果是黑洞被填上、断开的线被连起来。
cpp 复制代码
erode(src, dst, elem);    // 取局部最小
dilate(src, dst, elem);   // 取局部最大

这里有个常见的误解要澄清:形态学不是二值图专用。在灰度图上,腐蚀膨胀就是「局部最小/最大」,照样能跑,效果是亮暗区域的收放。

四、morphologyEx:七种操作一次说清

腐蚀和膨胀是基础,把它们组合起来,就得到了剩下的操作。OpenCV 用 morphologyEx 一个入口统一封装:

cpp 复制代码
morphologyEx(src, dst, op, elem);

op 可以取七种,公式和用途一张表讲清楚:

操作 公式 用途
erode 局部最小 去白噪点、断开粘连
dilate 局部最大 补洞、连断线
open 开运算 先腐蚀后膨胀 去掉小的亮斑、毛刺
close 闭运算 先膨胀后腐蚀 填掉小的暗洞、裂缝
gradient 梯度 膨胀减腐蚀 提取物体轮廓(比 Canny 更「胖」的整圈边缘)
tophat 顶帽 原图减开运算 只留比结构元素小的亮结构
blackhat 黑帽 闭运算减原图 只留比结构元素小的暗结构

开闭运算要重点理解,它们是一对「去毛刺/填裂缝」的组合拳,而且不会明显改变物体尺寸(腐蚀了再膨胀回来,净变化很小)。梯度操作也值得注意,它得到的边缘和上一篇的 Canny 是两种东西------Canny 是 1 像素宽的细线,形态学梯度是「整圈」的粗边缘。

顶帽和黑帽则是工业检测里的利器:如果你要在一堆零件里找「小的亮点」或「小的暗点」,顶帽/黑帽能一次性把背景滤掉,只留这些细节。

五、踩坑记录

这一课编译一次通过,没有硬性报错,但有三个知识点误区,踩进去就是静默的错误结果:

现象 原因 正确姿势
anchor 用错 非对称核结果偏移 getStructuringElement 的 anchor 默认是核中心 对称核不用管;非对称核才需显式指定 anchor
把梯度当 Canny 得到的边缘是粗的 gradient = 膨胀减腐蚀,是「整圈」边缘,不是细线 要细线用 Canny,要粗轮廓用 gradient
结构元素尺寸乱设 细节去不掉/过度处理 核越大能处理的细节尺度越大 开闭运算只能处理「小于核尺寸」的细节,按目标细节大小选核

六、AI 与 LLM Wiki:这一课沉淀了什么

照例讲知识库更新。LLM Wiki 现在 16 页了,这一课新增了「形态学操作:腐蚀膨胀与开闭运算」概念页,内容包括:腐蚀/膨胀的局部最小/最大本质、四种结构元素对照表、morphologyEx 七种操作的公式和用途表、以及三条知识点陷阱。两张截图归档进素材目录,进度表上 morphology2 实例勾选完成,从 18 个变成 19 个,进度 20%。

这一课最值得写进知识库的,是「形态学不限于二值图」这个认知纠偏。很多人(包括一开始的我)都以为腐蚀膨胀只能用在黑白二值图上,其实灰度图上就是局部最大最小,效果一样能看。这种「想当然」的认知偏差,写进概念页里,下次查的时候能直接纠正。

到这里,imgproc 的进度是边缘、形态学两个地基打好了。接下来进入轮廓分析------findContours 那套,真正开始「识别物体形状」的实战。

写在最后

97 个实例,今天完成第 19 个,进度 20%。这一课的核心收获是:形态学看着复杂,本质就是「结构元素 + 腐蚀/膨胀」两个基本动作,其余全是组合。把开闭运算和顶帽黑帽记牢,工业检测里的去噪、填洞、提细节这些高频操作就有了趁手的工具。

下一篇进入轮廓分析------findContours 找轮廓、拟合椭圆,开始从「像素处理」走向「形状识别」。到时候见。

相关推荐
经济视野1 小时前
输入户型图自动生成装修方案的软件有哪些
人工智能
richard_first1 小时前
第8章 Feed Forward Network(FFN 网络)
网络·人工智能·深度学习·机器学习·transformer
pjj198541 小时前
opencv-基于 SIFT 特征和 FLANN 匹配器的图像特征点匹配与可视化
人工智能·opencv·计算机视觉
Wang's Blog1 小时前
Vibe Coding一人即团队系列2: AI驱动的全链路产品开发实践
人工智能
飞哥数智坊1 小时前
豆包工作上线:功能超多,但我更关注这3个地方
人工智能
Csvn1 小时前
第 4 章 提示工程
人工智能·aigc
小白的成长路程1 小时前
AI搜索里,品牌被悄悄降级了
人工智能·geo
这就是佬们吗1 小时前
AI 的记忆进化史:从金鱼记忆到学会做梦
人工智能·python·embedding
智塑未来1 小时前
金融AI应用解决方案选型先看哪三项
人工智能·金融