当前位置: 首页 > news >正文

机器视觉opencv教程(三):形态学变换(腐蚀与膨胀)

文章目录

    • 一、形态学变换总览
    • 二、基本操作:腐蚀与膨胀
      • 2.1 腐蚀操作(Erosion)
        • 1. 核心原理
        • 2. 效果
      • 2.2 膨胀操作(Dilation)
        • 1. 核心原理
        • 2. 效果
      • 2.3 腐蚀 vs 膨胀 对比表
    • 三、组合操作:开运算与闭运算
      • 3.1 开运算(Opening)
        • 1. 操作顺序
        • 2. 核心原理
        • 3. 作用
      • 3.2 闭运算(Closing)
        • 1. 操作顺序
        • 2. 核心原理
        • 3. 作用
      • 3.3 开运算 vs 闭运算 对比表
    • 四、关键总结

一、形态学变换总览

  • 定义:一种基于图像形状的简单变换,核心是通过「核」与原始图像的交互,调整二值化图像的像素分布。
  • 处理对象:主要是 二值化图像(像素值仅为 0 黑色 / 255 白色)。
  • 核心组成:
    1. 原始二值化图像:待处理的图像。
    2. 核(结构化元素):用于滑动计算的模板,决定变换的范围和形状(常见形状:矩形、十字形、椭圆形)。
  • 基础逻辑:核在图像上从左到右、从上到下滑动,通过特定计算规则(取最小 / 最大值)更新核覆盖区域的中心像素值

二、基本操作:腐蚀与膨胀

形态学变换的两个核心基础操作,二者效果完全相反,是后续组合操作的基础。

在这里插入图片描述

2.1 腐蚀操作(Erosion)

1. 核心原理

核在二值化图像上滑动,对核值为 1 的区域与被覆盖的图像区域进行「相乘」,取计算结果的最小值作为中心像素的新值。

  • 二值图特殊规则:若核覆盖区域内存在黑色像素(0),则中心像素必为黑色(0)
  • 仅当所有覆盖像素均为白色(255)时,中心像素才为白色。
2. 效果

将二值化图像中的白色区域「变瘦」,可削弱细小白色结构、分离邻近的白色区域。

import cv2# 步骤1:读取彩色图像
image_np = cv2.imread('./test.png')  # 步骤2:彩色图 → 灰度图(二值化的前提)
image_gray = cv2.cvtColor(image_np, cv2.COLOR_BGR2GRAY)# 步骤3:灰度图 → 二值化图(阈值127:>127设为255白,≤127设为0黑)
ret, image_thresh = cv2.threshold(image_gray, 127, 255, cv2.THRESH_BINARY)# 步骤4:构建核(结构化元素)
# 参数1:核形状(MORPH_CROSS=十字形,MORPH_RECT=矩形,MORPH_ELLIPSE=椭圆形)
# 参数2:核大小((9,9)表示9x9,尺寸越大,腐蚀效果越强)
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (9, 9))# 步骤5:执行腐蚀操作
image_erode = cv2.erode(image_thresh, kernel)  # 输入:二值图+核# 步骤6:显示结果(按任意键关闭窗口)
cv2.imshow('原始二值图', image_thresh)
cv2.imshow('腐蚀后图像(变瘦)', image_erode)
cv2.waitKey(0)  # 等待按键输入
cv2.destroyAllWindows()  # 关闭所有窗口

2.2 膨胀操作(Dilation)

1. 核心原理

与腐蚀完全相反:核在二值化图像上滑动,对核值为 1 的区域与被覆盖的图像区域进行「相乘」,取计算结果的最大值作为中心像素的新值。

  • 二值图特殊规则:若核覆盖区域内存在白色像素(255),则中心像素必为白色(255);
  • 仅当所有覆盖像素均为黑色(0)时,中心像素才为黑色。
2. 效果

将二值化图像中的白色区域「变胖」,可增强细小白色结构、连接邻近的白色区域。

import cv2# 步骤1-3:与腐蚀操作一致(读取→灰度化→二值化)
image_np = cv2.imread('./test.png')  
image_gray = cv2.cvtColor(image_np, cv2.COLOR_BGR2GRAY)
ret, image_thresh = cv2.threshold(image_gray, 127, 255, cv2.THRESH_BINARY)# 步骤4:构建核(此处用矩形核,与腐蚀的十字形区分)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))  # 7x7核,膨胀强度适中# 步骤5:执行膨胀操作
image_dilate = cv2.dilate(image_thresh, kernel)# 步骤6:显示结果
cv2.imshow('原始二值图', image_thresh)
cv2.imshow('膨胀后图像(变胖)', image_dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.3 腐蚀 vs 膨胀 对比表

维度腐蚀操作(Erosion)膨胀操作(Dilation)
计算逻辑核覆盖区域取「最小值」核覆盖区域取「最大值」
二值图规则有黑色(0)则中心为黑有白色(255)则中心为白
白色区域效果「变瘦」(收缩)「变胖」(扩张)
核心作用削弱细小白色结构、分离邻近区域增强细小白色结构、连接邻近区域

三、组合操作:开运算与闭运算

基于「腐蚀」和「膨胀」的顺序组合,解决更复杂的图像问题(如去噪、填洞)。

3.1 开运算(Opening)

1. 操作顺序

先腐蚀 → 再膨胀(先收缩再扩张)。

2. 核心原理
  • 第一步腐蚀去除图像中的细小白色噪点(小白色区域被腐蚀掉),但会让主要白色物体变瘦。
  • 第二步膨胀:将主要白色物体恢复到接近原始大小,同时保留 “去噪” 的效果。
3. 作用
  • 去除图像中的白色小噪点(不影响主要白色物体的形状和大小)。
  • 分离邻近的白色物体(避免粘连)。
import cv2# 步骤1-3:读取→灰度化→二值化
img = cv2.imread("img.png")  # 替换为自己的图像路径
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)# 步骤4:构建核(5x5矩形核,通用尺寸)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))# 步骤5:执行开运算(用morphologyEx函数,指定操作类型为MORPH_OPEN)
opening = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)# 步骤6:显示结果
cv2.imshow("原始二值图", binary)
cv2.imshow("开运算结果(去白色噪点)", opening)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.2 闭运算(Closing)

1. 操作顺序

先膨胀 → 再腐蚀(先扩张再收缩)。

2. 核心原理
  • 第一步膨胀填充主要白色物体内部的细小黑色空洞(空洞被白色填充),但会让主要白色物体变胖。
  • 第二步腐蚀:将主要白色物体恢复到接近原始大小,同时保留 “填洞” 的效果。
3. 作用
  • 填充主要白色物体内部的黑色小空洞(不影响物体整体形状)。
  • 连接邻近的白色物体(修复微小断裂)。
import cv2# 步骤1-4:与开运算一致(读取→灰度化→二值化→构建核)
img = cv2.imread("img.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))# 步骤5:执行闭运算(操作类型为MORPH_CLOSE)
closing = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)# 步骤6:显示结果
cv2.imshow("原始二值图", binary)
cv2.imshow("闭运算结果(填黑色空洞)", closing)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.3 开运算 vs 闭运算 对比表

维度开运算(Opening)闭运算(Closing)
操作顺序腐蚀 → 膨胀膨胀 → 腐蚀
核心作用去除白色小噪点、分离邻近物体填充黑色小空洞、连接邻近物体
适用场景图像含细小白色杂点时图像含细小黑色空洞时
对主要物体影响形状 / 大小基本不变形状 / 大小基本不变

四、关键总结

  1. 核心逻辑:形态学变换基于「核滑动」和「极值计算」(最小 / 最大),仅作用于二值化图像。
  2. 操作选择:
    • 想让白色区域变瘦 → 腐蚀;想变胖 → 膨胀。
    • 去除白色小噪点运算;想填充黑色小空洞 → 运算。
  3. 核的影响:核的尺寸越大,变换效果越强;核的形状(矩形 / 十字形 / 椭圆形)影响变换的方向性(如十字形对线性结构更敏感)。

文章转载自:

http://5Str0Zt9.hnpkr.cn
http://zh4b0S2i.hnpkr.cn
http://3Jg3qvyD.hnpkr.cn
http://VFp39wrm.hnpkr.cn
http://HYupoMfD.hnpkr.cn
http://8jfD58XH.hnpkr.cn
http://RKwA3xvI.hnpkr.cn
http://BUa1XwGI.hnpkr.cn
http://NIc5MI8K.hnpkr.cn
http://WDeP8vze.hnpkr.cn
http://I04RglN3.hnpkr.cn
http://5uYpgOVb.hnpkr.cn
http://75K7TZ7u.hnpkr.cn
http://UNUzntD3.hnpkr.cn
http://qRDWnVcf.hnpkr.cn
http://ulN5WvJN.hnpkr.cn
http://0OBav0m8.hnpkr.cn
http://sfyIbyR4.hnpkr.cn
http://moEHlTr3.hnpkr.cn
http://ukI6k2tC.hnpkr.cn
http://unXPDZQZ.hnpkr.cn
http://gtlSdIxt.hnpkr.cn
http://JCxFwDqU.hnpkr.cn
http://5SZnpwpm.hnpkr.cn
http://XbDj5GNd.hnpkr.cn
http://k7iuW3CW.hnpkr.cn
http://WGSSc0Ry.hnpkr.cn
http://o4bRNmpd.hnpkr.cn
http://McY3yr6u.hnpkr.cn
http://jfezLxTt.hnpkr.cn
http://www.dtcms.com/a/359998.html

相关文章:

  • pyinstaller打包后失败问题记录
  • Linux系统(项目)之----进程池
  • 搭建卷积神经网络
  • LangChain 核心链式组件对比:从 SequentialChain 到 LCEL
  • 想学怎么写网站怎么办?初学者专用! (HTML+CSS+JS)
  • 【大语言模型 32】Constitutional AI:自我改进的对齐方法
  • TJA1445学习笔记(二)
  • Python入门教程之类型判别
  • Qt Core 之 QString
  • 响应式编程框架Reactor【7】
  • React Hooks useMemo
  • JVM学习总结
  • docker中的命令(四)
  • 大话 IOT 技术(3) -- MQTT篇
  • 机器视觉学习-day19-图像亮度变换
  • 【模型训练篇】VeRL分布式基础 - 框架Ray
  • 分布式相关
  • 正则表达式 Python re 库完整教程
  • 如何用熵正则化控制注意力分数的分布
  • 让你的App与众不同打造独特品牌展示平台
  • Scikit-learn Python机器学习 - 类别特征提取- OneHotEncoder
  • 编写Linux下usb设备驱动方法:disconnect函数中要完成的任务
  • 【数学建模学习笔记】异常值处理
  • RAG(检索增强生成)技术的核心原理与实现细节
  • 【Unity开发】Unity核心学习(三)
  • macos自动安装emsdk4.0.13脚本
  • 在Ubuntu系统上安装和配置JMeter和Ant进行性能测试
  • 基于SpringBoot + Vue 的宠物领养管理系统
  • 【Spring Cloud微服务】7.拆解分布式事务与CAP理论:从理论到实践,打造数据一致性堡垒
  • ANR InputDispatching TimeOut超时判断 - android-15.0.0_r23