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

图像形态学操作-腐蚀与膨胀,开运算和闭运算(含简单代码演示)

形态学操作是图像处理中的基础技术,主要用于分析和处理图像中的形状与结构,其中膨胀(Dilation)腐蚀(Erosion)是最核心的两个操作。它们通常基于结构元素(Structuring Element)对二值图像(黑白图像)进行处理,也可扩展至灰度图像。

1. 膨胀(Dilation)

原理
  • 定义:膨胀通过滑动结构元素(如矩形、圆形等)扫描图像,若结构元素与图像中的前景(白色区域)有交集,则将锚点位置设为前景。

  • 效果:扩展前景区域,填充小孔洞、连接邻近物体、平滑边缘。

  • 数学表达(集合论):
    A\oplus B=\left \{ \left.\begin{matrix} z \end{matrix}\right| \left ( B \right )_z\bigcap A\neq \varnothing \right \}
    其中,A 是原图像,B 是结构元素,(B)z 表示结构元素平移至位置 z。

应用场景
  • 填补断裂的文字笔画。

  • 连接因噪声分离的物体。

  • 增加目标区域尺寸。

示例

原始图像:[0,1,0](二值化,1为前景)
结构元素:[1,1,1](3像素水平线,锚点居中)
膨胀结果:[1,1,1](所有位置被填充)。

2. 腐蚀(Erosion)

原理
  • 定义:腐蚀要求结构元素完全覆盖图像的前景区域,仅在满足条件时保留锚点位置的前景。

  • 效果:缩小前景区域,消除细小噪声、分离粘连物体、锐化边缘。

  • 数学表达
    A\ominus B=\left \{ \left.\begin{matrix} z \end{matrix}\right| \left ( B \right )_z\subseteq A \right \}

应用场景
  • 去除图像中的胡椒噪声(孤立小点)。

  • 分离紧邻的物体(如细胞、颗粒)。

  • 保留主体结构,去除边缘毛刺。

示例

原始图像:[1,1,1,1,1](连续前景)
结构元素:[1,1,1](3像素水平线)
腐蚀结果:[0,1,1,1,0](两端被腐蚀)。

3. 膨胀与腐蚀的对比

特性膨胀(Dilation)腐蚀(Erosion)
作用扩大前景区域缩小前景区域
抗噪声能力可能放大噪声能消除小噪声
结构依赖依赖结构元素与图像的交集依赖结构元素完全覆盖图像区域
对偶性膨胀的补集 = 腐蚀补集(对偶操作)腐蚀的补集 = 膨胀补集(对偶操作)

4. 结构元素的影响

  • 形状:矩形、圆形、十字形等不同形状会控制膨胀/腐蚀的方向性(如十字形侧重水平和垂直扩展)。

  • 尺寸:结构元素越大,膨胀/腐蚀的效果越显著。

  • 锚点位置:决定膨胀/腐蚀的中心参考点(默认常为中心)。


5. 组合应用

  • 开运算(Opening):先腐蚀后膨胀,用于去噪并保持主体形状。

  • 闭运算(Closing):先膨胀后腐蚀,用于填充孔洞并平滑轮廓。


直观理解

  • 膨胀:想象用“画笔”沿物体边缘涂抹,使其变粗。

  • 腐蚀:想象用“橡皮”擦除物体边缘,使其变细。

通过调整结构元素和组合操作,膨胀与腐蚀能灵活应对图像分割、边缘检测、形态过滤等多种任务。以下展示一个单区域的膨胀操作代码实现:

import numpy as np
from scipy.ndimage import binary_dilationregion = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 1, 1, 0, 0, 0, 0, 0, 0],[0, 0, 1, 1, 1, 1, 0, 0, 0, 0],[0, 0, 1, 1, 1, 1, 1, 0, 0, 0],[0, 0, 0, 1, 1, 1, 1, 0, 0, 0],[0, 0, 0, 0, 1, 1, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]# 转换为NumPy数组
region_np = np.array(region)# 定义3x3全1结构元素(可根据需要调整结构元素形状)
struct = np.ones((3, 3), dtype=int)# 执行膨胀操作
dilated = binary_dilation(region_np, struct).astype(int)# 转换回列表格式并打印结果
dilated_region = dilated.tolist()for row in dilated_region:print(row)
'''
dilated_region = 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 1, 1, 1, 0, 0, 0, 0, 0]
[0, 1, 1, 1, 1, 1, 1, 0, 0, 0]
[0, 1, 1, 1, 1, 1, 1, 1, 0, 0]
[0, 1, 1, 1, 1, 1, 1, 1, 0, 0]
[0, 1, 1, 1, 1, 1, 1, 1, 0, 0]
[0, 0, 1, 1, 1, 1, 1, 1, 0, 0]
[0, 0, 0, 1, 1, 1, 1, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
'''

相关文章:

  • P2676 [USACO07DEC] Bookshelf B
  • MySQL重置密码终极版
  • 【Java高阶面经:缓存篇】35、 Redis单线程 vs Memcached多线程:高性能内存数据库设计解析
  • 阿里云OSS Api工具类不使用sdk
  • 通过 Terraform 构建您的第一个 Azure Linux 虚拟机
  • AWS EC2 使用Splunk DB connect 连接 RDS mysql
  • Missashe考研日记—Day44-Day50
  • 怎么判断文件是否支持多线程下载
  • orzdba.gz 下载解压使用教程:MySQL/InnoDB 监控命令参数详解与实战技巧
  • 优先级队列 模版题单
  • YOLOv8源码修改(5)- YOLO知识蒸馏(下)设置蒸馏超参数:以yolov8-pose为例
  • [C++] 洛谷B3959(GESP2024三月四级)做题
  • LLM多平台统一调用系统-LiteLLM概述
  • C++ 中的引用参数(Reference Parameter)‌
  • 【DeepSeek】计算机科学与技术专业的学习顺序
  • Vue3编译器:静态提升原理
  • 【Simulink】IEEE5/IEEE9/IEEE14/IEEE30/IEEE33/IEEE39仿真模型
  • 【Day36】
  • openjdk底层(hotspot)汇编指令的内存分布
  • 关于多类型数据划分清洗的整理
  • 网络开发公司/优化服务公司
  • web项目网站开发流程怎么写/提升关键词排名seo软件
  • 重庆出名的网站建设公司/最新seo操作
  • 免费h5网站模版/成人企业管理培训课程
  • 做企业网站的/百度搜索引擎的特点
  • 医疗网站建设方案/代刷网站推广