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

📅 2026/8/25 14:04:27
97 个 OpenCV 实例(九):形态学操作,腐蚀膨胀与开闭运算
上一篇讲边缘检测用一阶导和二阶导「找」边缘。这一篇换个角度讲怎么「修」形状——形态学操作。它是图像处理里处理形状的一类算子去噪点、补漏洞、断粘连、提轮廓全是它的活。工业视觉里形态学几乎是每个分割流程的前置步骤值得单独吃透。一、效果先行先看两张对比图。第一张演示「结构元素」的形状影响。同一张图同样做一次膨胀但分别用矩形、椭圆、十字、菱形四种结构元素结果的形状走向明显不同第二张是形态学操作全家桶。原图加上七种操作腐蚀、膨胀、开运算、闭运算、梯度、顶帽、黑帽排成 2x4 网格一次看全两张图看完先记住一句话形态学的核心是「结构元素」操作本身只有两个基本动作——腐蚀和膨胀其余全是它们的组合。二、形态学是什么结构元素在图像上滑动形态学这个名字听着玄其实思路特别朴素拿一个小形状叫结构元素在图像上一点点滑动每到一个位置就对这个区域做一次局部运算。关键就是这个「结构元素」structuring element。它是一个小矩阵形状可以是矩形、椭圆、十字、菱形尺寸可大可小。它决定了后续操作会「朝什么方向、以什么尺度」影响图像。OpenCV 里用 getStructuringElement 创建它Mat elemgetStructuringElement(MORPH_RECT,Size(15,15));// 形状MORPH_RECT 矩形 / MORPH_ELLIPSE 椭圆 / MORPH_CROSS 十字 / MORPH_DIAMOND 菱形对比图一里同样一次膨胀矩形结构元素的结果是方正的边缘椭圆是圆滑的十字和菱形各有各的走向。这就是结构元素的价值——它把「形状」这个维度显式地暴露给你控制。三、腐蚀与膨胀一对相反的操作两个基本操作方向正好相反腐蚀erode结构元素扫过取覆盖区域的最小值。亮的地方收缩、暗的地方扩张——结果是白色噪点被吃掉、粘连的物体被断开膨胀dilate取覆盖区域的最大值。亮的地方扩张、暗的地方收缩——结果是黑洞被填上、断开的线被连起来。erode(src,dst,elem);// 取局部最小dilate(src,dst,elem);// 取局部最大这里有个常见的误解要澄清形态学不是二值图专用。在灰度图上腐蚀膨胀就是「局部最小/最大」照样能跑效果是亮暗区域的收放。四、morphologyEx七种操作一次说清腐蚀和膨胀是基础把它们组合起来就得到了剩下的操作。OpenCV 用 morphologyEx 一个入口统一封装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 找轮廓、拟合椭圆开始从「像素处理」走向「形状识别」。到时候见。