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

机器视觉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://www.xdnf.cn/news/19580.html

相关文章:

  • 利用爬虫获取淘宝商品信息,参数解析
  • 基于单片机停车场管理系统/车位管理/智慧停车系统
  • 小迪自用web笔记22
  • Java线程池使用入门
  • uvm验证环境中struct(结构体)和class的区别与联系
  • 基于单片机老人防丢失防摔倒系统/老人健康状态检测系统
  • CMake⼯程指南-3
  • [光学原理与应用-361]:ZEMAX - 分析 - 像差分析
  • KingbaseES V009版本发布:国产数据库的新飞跃
  • 基于全参考图的质量评价均方误差MSE、峰值信噪比PSNR
  • [特殊字符] Rust概述:系统编程的革命者
  • 力扣(LeetCode) ——101. 对称二叉树(C语言)
  • Vue Router 嵌套路由与布局系统详解:理解 component = router-view 的核心概念
  • 接口测试总结-含接口测试和前端测试的区别与比较
  • Matlab自学笔记六十六:求解带参数的不等式
  • 国庆福建霞浦游
  • Linux 启动传参
  • 使用AdaLoRA 自适应权重矩阵微调大模型介绍篇
  • Docker一小时快速上手(附报错解决方式)
  • 【MLLM】具有长期记忆的多模态智能体框架M3-Agent
  • 《信息学奥林匹克辞典》中的一个谬误
  • Java异常处理完全指南:从入门到精通
  • 安装proteus,并实现stm32仿真
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘pydantic’问题
  • 从 ETL 到 ELT 再到 EAI:AI 如何重塑数据处理
  • 小迪安全v2023学习笔记(七十五讲)—— 验证码安全插件识别攻击利用宏命令
  • 设计模式在Java中的应用:从单例模式到工厂模式的全面解析!
  • 计算机网络总览
  • 使用 GLSL 实现真实自然的纹理混合技术详解
  • 【Java实战⑨】Java集合框架实战:List集合深度剖析