《OpenCV计算机视觉》—— 图像形态学(腐蚀、膨胀等)

文章目录

  • 一、图像形态学基本概念
  • 二、基本运算
    • 1.简单介绍
    • 2.代码实现
  • 三、高级运算
    • 1.简单介绍
    • 2.代码实现

一、图像形态学基本概念

  • 图像形态学是图像处理科学的一个独立分支,它基于集合论和数学形态学的理论,专门用于分析和处理图像中的形状和结构
  • 图像形态学处理主要关注的是二值图像(黑白图像或是灰度图),其基本思想是用具有一定形态特征的结构元素去量度和提取图像中的对应形状,以实现图像分析和识别的目的。与传统的基于线性理论的空域或频域图像处理技术相比,图像形态学具有不模糊图像边界和细节、对噪声不敏感、提取的图像边缘平滑、骨架较连续、易于并行处理等特点

二、基本运算

1.简单介绍

  • 图像形态学的基本运算主要包括四种:膨胀、腐蚀、开运算和闭运算。

    • 腐蚀(Erosion):通过结构元素与图像进行卷积,将结构元素包含的图像区域缩小,以去除图像中小的细节和噪声。这一操作可以用于细化边缘、分离紧密相连的物体等。
    • 膨胀(Dilation):与腐蚀相反,膨胀操作通过结构元素与图像进行卷积,将结构元素包含的图像区域扩大,以填充图像中的空洞和连接图像中的断线。这有助于填充小的空洞、连接断裂的物体等。
    • 开运算(Opening):先进行腐蚀操作,再进行膨胀操作的组合。这种操作可以去除图像中的小噪声和细小物体,同时保留图像中的主要结构。
    • 闭运算(Closing):与开运算相反,闭运算是先进行膨胀操作,再进行腐蚀操作的组合。它可以用于填充图像中的小空洞,连接图像中的断裂结构,并平滑图像边缘。

2.代码实现

  • 基本运算代码实现

    import cv2
    import numpy as np# 读取图像(这里所给的图片已经是黑白图,直接读取,不需要进行二值化操作)
    image = cv2.imread('zhiwen.png')# 定义结构元素
    # 这里使用3x3的正方形结构元素
    kernel = np.ones((3, 3), np.uint8)# 腐蚀操作 cv2.erode()
    eroded_image = cv2.erode(image, kernel, iterations=1)  # iterations 为迭代次数(执行了多少次操作)# 膨胀操作 cv2.dilate()
    dilated_image = cv2.dilate(image, kernel, iterations=1)# cv2.morphologyEx() 函数用于执行更复杂的形态学操作,如开运算和闭运算
    # 开运算:先腐蚀后膨胀  cv2.MORPH_OPEN()
    opening_image = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)# 闭运算:先膨胀后腐蚀  cv2.MORPH_CLOSE()
    closing_image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)# 显示结果
    cv2.imshow('Original Image', image)
    cv2.imshow('Eroded Image', eroded_image)
    cv2.imshow('Dilated Image', dilated_image)
    cv2.imshow('Opening Image', opening_image)
    cv2.imshow('Closing Image', closing_image)# 等待任意键按下后关闭所有窗口
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
  • 原图如下
    在这里插入图片描述

  • 腐蚀图(左)与膨胀图(右)
    在这里插入图片描述

  • 开运算图(左)与闭运算图(右)
    在这里插入图片描述

三、高级运算

1.简单介绍

  • 基于上述基本运算,还可以推导出多种高级形态学运算方法,如形态学梯度、顶帽变换、底帽变换等。

    • 形态学梯度(Morphological Gradient):通过膨胀和腐蚀操作的差异,可以得到图像边缘的强度信息,有助于边缘检测
    • 顶帽变换:先将图像进行开运算(先腐蚀后膨胀),然后将原始图像与开运算结果相减,作用与应用如下:
      • 顶帽变换能够突出原始图像中比周围区域更明亮的小尺度细节或亮度变化。
      • 常用于增强图像的局部对比度,以突出微小的细节,如血管、细胞核等。
      • 在医学图像分析(如血管和细胞核分割)以及纹理分析中发挥重要作用。
    • 黑帽变换:先将图像进行闭运算(先膨胀后腐蚀),然后用闭运算结果减去原始图像 ,作用与应用如下:
      • 黑帽变换能够突出原始图像中比周围区域更暗的小尺度细节或亮度变化。
      • 常用于检测图像中的小暗斑点或小暗物体,以及用于凸显亮背景上的暗物体。
      • 在图像增强、缺陷检测、文字识别等领域有广泛应用。

2.代码实现

  • 形态学梯度运算代码实现

    """梯度运算"""
    # 读取图片
    wenzi = cv2.imread('wenzi.png')# 定义结构元素
    # 这里使用2x2的正方形结构元素
    kernel = np.ones((2, 2), np.uint8)# 膨胀
    pz_wenzi = cv2.dilate(wenzi, kernel, iterations=2)
    # 腐蚀
    fs_wenzi = cv2.erode(wenzi, kernel, iterations=2)# 膨胀 - 腐蚀  cv2.MORPH_GRADIENT
    TiDu_wenzi = cv2.morphologyEx(wenzi, cv2.MORPH_GRADIENT, kernel)# 显示图片
    cv2.imshow('yuantu_wenzi', wenzi)
    cv2.imshow('pz_wenzi', pz_wenzi)
    cv2.imshow('fs_wenzi', fs_wenzi)
    cv2.imshow('TiDu_wenzi', TiDu_wenzi)# 等待任意键按下后关闭所有窗口
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
  • 原图
    在这里插入图片描述

  • 膨胀(左)、腐蚀(中)、形态学梯度运算(膨胀 - 腐蚀)(右)
    在这里插入图片描述

  • 顶帽和黑帽代码实现

    """顶帽和黑帽"""
    # 顶帽 = 原始图片 - 开运算结果(先腐蚀后膨胀)
    # 黑帽 = 原始图片 - 闭运算结果(先膨胀后腐蚀)# 读取图片
    sun = cv2.imread('sun.png')# 定义结构元素
    # 这里使用3x3的正方形结构元素
    kernel = np.ones((3, 3), np.uint8)# 开运算
    sun_open = cv2.morphologyEx(sun, cv2.MORPH_OPEN, kernel)
    # 闭运算
    sun_close = cv2.morphologyEx(sun, cv2.MORPH_CLOSE, kernel)# 顶帽  cv2.MORPH_TOPHAT
    tophat = cv2.morphologyEx(sun, cv2.MORPH_TOPHAT, kernel)# 黑帽  cv2.MORPH_BLACKHAT
    blackhat = cv2.morphologyEx(sun, cv2.MORPH_BLACKHAT, kernel)# 显示图片
    cv2.imshow('sun_yuantu', sun)
    cv2.imshow('sun_open', sun_open)
    cv2.imshow('sun_close', sun_close)
    cv2.imshow('TOPHAT', tophat)
    cv2.imshow('blackhat', blackhat)# 等待任意键按下后关闭所有窗口
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
  • 原图
    在这里插入图片描述

  • 开运算(左)与顶帽(右)
    在这里插入图片描述

  • 闭运算(左)与黑帽(右)
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/418036.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于YOLOv10的垃圾检测系统

基于YOLOv10的垃圾检测系统 (价格90) 包含 [CardBoard, Glass, Metal, Paper, Plastic] 5个类 [纸板, 玻璃, 金属, 纸张, 塑料] 通过PYQT构建UI界面,包含图片检测,视频检测,摄像头实时检测。 (该系统可以根据数据训练出的…

Spring之Bean的生命周期 2024-9-6 19:47

目录 什么是Bean的生命周期为什么要知道Bean的生命周期Bean的生命周期之5步Bean生命周期之7步Bean生命周期之10步 声明:本章博客内容采自老杜2022spring6 语雀文档 什么是Bean的生命周期 Spring其实就是一个管理Bean对象的工厂。它负责对象的创建,对象的…

webpack+lite-server 构建项目示例

首先安装以下库 npm install --save-dev webpack webpack-cli lite-server npm install --save-dev babel-loader babel/core babel/preset-env项目结构 webpack.config.js 配置 const path require("path");module.exports {entry: "./src/index.js",…

数据分析-12-多个时间序列数据的时间戳对齐以及不同的方式补点

参考python时间序列数据的对齐和数据库的分批查询 1 问题场景与分析 1.1 场景 在医院的ICU里,须要持续观察病人的各项生命指标。这些指标的采集频率每每是不一样的(例如有些指标隔几秒采集一个,有些几个小时采集一个,有些一天采集一个),并且有些是按期的,有些是不按期的…

SenseGlove机器臂遥操作控制:技术优势与高危作业安全保障

在追求高效与安全的工业时代,高危作业任务始终是行业发展的一大障碍。SenseGlove力反馈手套机器臂遥操作应用案例的出现,凭借其独特的技术优势,为解决这一难题提供了创新性解决方案。 一、技术优势 高精度的力反馈技术:SenseGlove…

传统CV算法——特征匹配算法

Brute-Force蛮力匹配 Brute-Force蛮力匹配是一种简单直接的模式识别方法,经常用于计算机视觉和数字图像处理领域中的特征匹配。该方法通过逐一比较目标图像中的所有特征点与源图像中的特征点来寻找最佳匹配。这种方法的主要步骤包括: 特征提取&#xff…

设计模式之装饰器模式:让对象功能扩展更优雅的艺术

一、什么是装饰器模式 装饰器模式(Decorator Pattern)是一种结构型设计模式(Structural Pattern),它允许用户通过一种灵活的方式来动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比使用…

使用html+css+layui实现动态表格组件

1、概述 需求,表格第一列指标可配置通过后端api传进来,表格显示数据以及鼠标触摸后气泡弹出层提示信息都是从后端传过来,实现动态表格的组件!!实现效果如下: 接口标准数据格式如下: {"da…

自动驾驶---什么是Frenet坐标系?

1 背景 为什么提出Frenet坐标系?Frenet坐标系的提出主要是为了解决自动驾驶系统在路径规划的问题,它基于以下几个原因: 符合人类的驾驶习惯: 人类驾驶员在驾驶过程中,通常不会关心自己距离起点的横向和纵向距离&#x…

TypeError:未绑定方法

TypeError: unbound method 错误通常发生在类方法被调用时,但没有正确绑定到实例。这通常意味着你试图在类本身上调用一个实例方法,或者没有使用正确的方式创建类实例。 1、问题背景 某位开发者在尝试创建一个类似于经典的 Pratt 递归下降解析器时遇到了…

目前国内外AI,尤其大模型发展的一些新进展

目前,国内外在AI大模型发展方面均取得了一系列的新进展。以下是一些关键点和发展路径的对比: 国际进展 技术创新与应用:国际上的大模型通常由大型科技公司如谷歌、微软、Meta等主导,它们利用现有的大模型技术来增强原有的产品和…

vue3+ts封装类似于微信消息的组件

组件代码如下&#xff1a; <template><div:class"[voice-message, { sent: isSent, received: !isSent }]":style"{ backgroundColor: backgroundColor }"click"togglePlayback"><!-- isSent为false在左侧&#xff0c;为true在右…

Google play最新政策更新和重要提醒

我们都知道&#xff0c;谷歌会定期更新其政策&#xff0c;而政策的变更通常对开发者及其团队的要求会更为严格&#xff0c;也会增加应用上架的一些限制条件&#xff0c;以此提高应用在谷歌商店的质量。 一起来看看Google play最近的一些政策更新和需要注意的地方。 新政策要求 …

【C++】简单易懂的vector迭代器

一、迭代器的本质 vector的迭代器本质上就是一个被封装的指针。迭代器的用法和指针的用法十分相似&#xff0c;就是一个像指针的假指针&#xff0c;我们不妨把迭代器看作一个伪指针。 二、迭代器的使用 句式&#xff08;可以看到迭代器和指针很像&#xff09;&#xff1a; …

5-2 检测内存容量

1 使用的是bios 中断&#xff0c; 每次进行检测都会返回一块 内容。并且标志上&#xff0c;这块内存是否可用。 接下来是代码&#xff1a; 首先是构建 一个文件夹&#xff0c; 两个文件。 types.h 的内容。 #ifndef TYPES_H #define TYPES_H// 基本整数类型&#xff0c;下面的…

2024国赛数学建模ABC题思路模型

完整的思路模型请查看文末名片 完整的思路模型请查看文末名片 完整的思路模型请查看文末名片

rust 命令行工具rsup管理前端npm依赖

学习了一年的 rust 了&#xff0c;但是不知道用来做些什么&#xff0c;也没能赋能到工作中&#xff0c;现在前端基建都已经开始全面进入 rust 领域了&#xff0c;rust 的前端生态是越来越好。但是自己奈何水平不够&#xff0c;想贡献点什么&#xff0c;无从下手。 遂想自己捣鼓…

23种设计模式之责任链模式

文章目录 23种设计模式之责任链模式主要角色和结构工作原理简单实现 - 学生成绩打印优点责任链 - 缺点责任链 - 应用场景责任链模式在Spring中的使用 23种设计模式之责任链模式 责任链设计模式是一种行为型设计模式&#xff0c;它允许多个对象依次处理一个请求&#xff0c;直到…

基于SpringBoot的外卖点餐系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootJSP 工具&#xff1a;IDEA/Eclipse、Navicat、Maven、Tomcat 系统展示 首页 用户管理界…

本地使用Docker部署Nexus Maven私有仓库工具结合内网穿透实现远程管理

文章目录 前言1. Docker安装Nexus2. 本地访问Nexus3. Linux安装Cpolar4. 配置Nexus界面公网地址5. 远程访问 Nexus界面6. 固定Nexus公网地址7. 固定地址访问Nexus 前言 本文主要介绍在Linux中使用Docker来一键部署Nexus Maven私有仓库工具并结合Cpolar内网穿透实现远程访问Nex…