形态学分析

在 OpenCV 中,形态学(Morphology)是一种图像处理技术,主要用于处理图像中的形状和结构。形态学操作基于图像形状的形态学特征,如点、线、曲线等,而不是像素值。形态学操作通常用于图像预处理、分割、边缘检测等任务,特别是在处理二值图像(如边缘检测后的图像)时特别有效。
OpenCV 中常见的形态学操作主要包括腐蚀、膨胀、开闭操作、形态学梯度、黑帽与顶帽、击中与不击中等。
morphologyEx 是OpenCV中用于执行各种形态学操作的函数之一,函数原型为:

void morphologyEx(
InputArray src,    //输入图像,可以是任何单通道图像,通常是CV_8U类型的
OutputArray dst,   // 输出图像,与输入图像类型一致。
int op,            //形态学操作类型,这里应选择 MORPH_OPEN
InputArray kernel,   //结构元素(或内核),确定操作的性质。可以使用 getStructuringElement() 函数创建不同形状和大小的结构元素。
Point anchor = Point(-1,-1),   //结构元素的锚点位置,默认为结构元素的中心点。
int iterations = 1,    //操作的迭代次数,默认为1。
int borderType = BORDER_CONSTANT,   //边界填充的方式,默认为 BORDER_CONSTANT。
const Scalar& borderValue = morphologyDefaultBorderValue()  //边界填充的值,默认为 morphologyDefaultBorderValue()。
);

op: 形态学操作类型,可以是以下之一:

  • cv::MORPH_ERODE = 0:腐蚀操作
  • cv::MORPH_DILATE = 1:膨胀操作
  • cv::MORPH_OPEN = 2:开操作(先腐蚀后膨胀)
  • cv::MORPH_CLOSE = 3:闭操作(先膨胀后腐蚀)
  • cv::MORPH_GRADIENT = 4:表示梯度操作(基本梯度)
  • cv::MORPH_TOPHAT = 5:表示顶帽操作
  • cv::MORPH_BLACKHAT = 6:表示黑帽操作
  • cv::MORPH_HITMISS = 7:表示击中/击不中操作

腐蚀与膨胀

腐蚀

腐蚀的作用

  • 物体缩小:腐蚀操作会使图像中的物体区域缩小。在二值图像中,腐蚀会使白色区域收缩,并尽可能减少物体边缘的尖锐部分。
  • 分离连接的物体:可以分离非常接近的物体,使它们之间的连接部分变窄或完全消失,从而将它们分开成两个独立的物体。
  • 去除小的物体:可以去除图像中小的物体或细小的物体结构,这些小物体可能是噪声或者不需要的细节。
  • 平滑物体边缘:可以减少物体边缘的不规则性和毛刺,使得物体的轮廓更加平滑和自然。

函数原型:

void erode(
InputArray src,   //输入图像,可以是任何单通道图像,通常是CV_8U类型的。
OutputArray dst,   //输出图像,与输入图像类型一致。
InputArray kernel,   //结构元素(或内核),确定操作的性质。可以使用 getStructuringElement() 函数创建不同形状和大小的结构元素。
Point anchor = Point(-1,-1),   //结构元素的锚点位置,默认为结构元素的中心点。
int iterations = 1,   //腐蚀操作的迭代次数,默认为1
int borderType = BORDER_CONSTANT,   //边界填充的方式,默认为 BORDER_CONSTANT。
const Scalar& borderValue = morphologyDefaultBorderValue()  //边界填充的值,默认为 morphologyDefaultBorderValue()。
);

膨胀

膨胀的作用:

  • 物体增大:膨胀操作可以使图像中的物体区域增大。在二值图像中,膨胀会使白色区域扩展,并尽可能填充物体周围的空白区域。
  • 连接物体:可以连接两个非常接近的物体,使它们合并为一个单一的物体。这对于图像中存在断开的物体或者物体之间有缝隙的情况特别有用。
  • 填充物体的空洞:可以填充物体内部的小空洞或孔洞,使得物体看起来更加完整和连续。
  • 边缘增强:可以增强物体的边缘,使得物体边界更加清晰和明显。

函数原型

void dilate(InputArray src,  //输入图像,可以是任何单通道图像,通常是CV_8U类型的OutputArray dst,   //输出图像,与输入图像类型一致。InputArray kernel,   //结构元素(或内核),确定操作的性质。可以使用 getStructuringElement() 函数创建不同形状和大小的结构元素。Point anchor = Point(-1,-1),   //结构元素的锚点位置,默认为结构元素的中心点。int iterations = 1,   //膨胀操作的迭代次数,默认为1。int borderType = BORDER_CONSTANT,   //边界填充的方式,默认为 BORDER_CONSTANT。const Scalar& borderValue = morphologyDefaultBorderValue()  //边界填充的值,默认为 morphologyDefaultBorderValue()。
);

开、闭操作

基于服饰与膨胀有两个组合操作,分别为开操作和闭操作。
开操作通常用于去除小物体和噪声,平滑边缘以及分离物体之间的连接部分。
闭操作通常用于填充孔洞,连接相邻的物体,平滑物体的轮廓以及去除物体内部的小黑洞。

开操作

开操作的定义是先腐蚀后膨胀,即:开操作 = 腐蚀 + 膨胀

闭操作

闭操作与开操作类似,即 :闭操作 = 膨胀 + 腐蚀

形态学梯度

形态学梯度也是基于腐蚀和膨胀操作的输出结果再做适当的组合得到的。
形态学梯度不仅可以快速得到二值图像中各个对象的轮廓】提取对象的边缘,还能在对灰度实现形态学梯度操作之后再进行二值化。常见的三种形态学梯度分别为:基本梯度、内梯度和外梯度

基本梯度

基本梯度是对原图分别执行膨胀操作和腐蚀操作,然后将二者的输出结果相减得到基本梯度
基本梯度 = 膨胀 ( s r c ) − 腐蚀 ( s r c ) 基本梯度 = 膨胀(src) - 腐蚀(src) 基本梯度=膨胀(src)腐蚀(src)

内梯度

内梯度 = 膨胀 ( s r c ) − 原图 ( s r c ) 内梯度 = 膨胀(src) - 原图(src) 内梯度=膨胀(src)原图(src)

外梯度

外梯度 = 原图 ( s r c ) − 腐蚀 ( s r c ) 外梯度 = 原图(src) - 腐蚀(src) 外梯度=原图(src)腐蚀(src)

代码示例

使用3 * 3大小的矩阵结构元素,对输入图像完成形态学腐蚀膨胀操作,然后分别求基本梯度、内梯度和外梯度

Mat se = getStructuringElement(MORPH_RECT, Size(3,3),Point(-1,-1));
Mat basic_grad ,ex_grad, in_grad;
Mat di, er;
dilate(image,di,se);
erode(image,er,se);//基本梯度
morphologyEx(image,basic_grad,MORPH_GRADIENT,se);//外梯度
substruct(di,image,ex_grad);//内梯度
substruct(image,er,in_grade);

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

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

相关文章

MATLAB基础:数据和变量

今天我们开始学习MATLAB基础知识 1、常用非运算符及其作用 1、“,” 作为程序运行的分隔符,起到分隔语句的作用 2、“;” 同样作为分隔符,与“,”不同的是“;”会在程序运行时隐藏该行语句 如下图: 3、“...” 三个英文句点表示续行符…

djiango-开始创建一个应用

pycharm查看djiango版本: django-admin --version 创建djiango项目 new project创建或者 django-admin startproject django_project cd django_project 文件作用: django_project ├──django_project // 项目全局文件目录 │ ├─…

ros2--launch--xml定义

定义规范 官网 node的属性 type ros2没有这个type属性。

W30-python03-pytest+selenium+allure访问百度网站实例

此篇文章为总结性,将pystest、selenium、allure结合起来 功能如下,web自动化,输入baidu网站,搜索“雷军”、打开网页中第一条内容 pytestsel.py如下: import time import re import allure import pytest from tools…

提升ROI:利用高级爬虫技术优化营销策略

如何通过高级爬虫技术高效提升营销ROI? 摘要: 在当今数据驱动的营销环境中,提升投资回报率(ROI)的关键在于精准洞察市场与用户行为。本文将探讨如何运用高级爬虫技术来优化营销策略,从海量互联网数据中挖掘…

C++ 《类与对象》(中下)

C 《类与对象》(下) 赋值运算符重运算符定义 取地址运算符重载const成员函数 初始化列表格式练习 类型转换结束!!!! 赋值运算符重 • 当运算符被⽤于类类型的对象时,C语⾔允许我们通过运算符重载…

立元科技-Java面经

面试时间:2024年2月13日 面试地点:线下 面试流程:一轮面试 首先写了点笔试题,但是人家根本不看(这个也就一面) (聊的还行,但是公司环境不是特别的好,一次面试&#x…

挖掘IPython的深度:%%dhist命令的历史探索之旅

挖掘IPython的深度:%%dhist命令的历史探索之旅 IPython,作为一款强大的交互式Python解释器,不仅提供了丰富的功能来增强Python编程体验,还允许用户轻松地回顾和利用历史命令。%%dhist命令是IPython中一个非常实用的魔术命令&…

【数据分享】2008-2022年我国省市县三级的逐日NO2数据(excel\shp格式)

空气质量数据是在我们日常研究中经常使用的数据!之前我们给大家分享了2000-2022年的省市县三级的逐日PM2.5数据、2013-2022年的省市县三级的逐日CO数据和2013-2022年的省市县三级的逐日SO2数据(均可查看之前的文章获悉详情)! 本次…

CrossEntropyLoss交叉熵损失函数的使用

目录 CrossEntropyLoss交叉熵损失函数的使用: 一、官方说明: 二、两种使用情况: 1)情况一:target是一个类索引(Example of target with class indices) 2)情况二:tar…

LeeCode Practice Journal | Day23_Backtracking

39.组合总和 题目&#xff1a;39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a;代码随想录 (programmercarl.com) 不同要求下的组合&#xff0c;可以进行一下总结 solution public class Solution {public List<IList<int>> results new…

Postman API测试数据生成秘籍:技巧与实践

Postman API测试数据生成秘籍&#xff1a;技巧与实践 在API测试过程中&#xff0c;生成合适的测试数据是确保测试覆盖率和准确性的关键步骤。Postman作为流行的API开发和测试工具&#xff0c;提供了多种方法来生成和管理测试数据。本文将深入探讨Postman中API测试数据生成的技…

jmeter实战(1)- Mac环境安装

一、安装 JDK 这个就不介绍了&#xff0c;本地自行安装 JDK 并且配置好环境变量 二、安装 Jmeter 1. 下载地址 —> 下载链接点击这里 2. 选择合适的版本下载 3. 解压到本地目录 解压后&#xff0c;会得到下面的目录文件&#xff1a; 输入cd bin&#xff0c;进入到bin…

Java中的多级缓存设计与实现

Java中的多级缓存设计与实现 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在现代应用程序中&#xff0c;多级缓存设计是一种常见的性能优化技术。多级缓存通过在不同层次上缓存数据来减少对底层存…

[STM32]HAL库实现自己的BootLoader-BootLoader与OTA-STM32CUBEMX

目录 一、前言 二、BootLoader 三、BootLoader的实现 四、APP程序 五、效果展示 六、拓展 一、前言 听到BootLoader大家一定很熟悉&#xff0c;在很多常见的系统中都会存在BootLoader。本文将介绍BootLoader的含义和简易实现&#xff0c;建议大家学习前掌握些原理基础。 …

目标检测算法:基本原理、发展历程、主要方法以及未来的发展趋势。

目标检测算法&#xff0c;作为计算机视觉领域中的一项关键技术&#xff0c;近年来得到了广泛的关注和研究。它旨在从图像或视频中准确地识别出目标的位置和类别&#xff0c;对于实现图像理解、视频分析、智能监控等应用具有重要意义。本文将详细介绍目标检测算法的基本原理、发…

实时更新UI界面

1.处理实时通信&#xff0c;几种方案 1&#xff1a;当一个用户发送一条需要实时更新的信息&#xff0c;我可以直接查找在线用户&#xff0c;通过在线用户来进行判断条件&#xff0c;发送更新请求 2&#xff1a;用户在一个需要实时更新的界面时&#xff0c;就不断的向服务端发…

【Android】Activity与Fragment的数据传递

上一篇文章学到了碎片的创建与生命周期&#xff0c;接下来学习碎片的常用操作&#xff0c;其中会用到上一篇文章的三个碎片&#xff0c;就做一个简单的说明吧&#xff1a;LeftFragment&#xff08;包含一个按钮&#xff09;、RightFragment4&#xff08;以粉色为背景的文本&…

408专业课130|零基础五个月速成攻略

计算机考研&#xff0c;有两个选择&#xff0c;一个是自命题&#xff0c;一个是408。如果你只是考一个普通院校&#xff0c;可以选择考自命题院校&#xff0c;容易上岸&#xff0c;但是如果考985/211/这类院校&#xff0c;最好还是选择408&#xff0c;因为408的考风险能力很强&…

Apollo部署与简易架构梳理

文章目录 apollo 安装apollo的基本架构组件机制component编译与加载 节点通讯数据的传输消息读写的实现消息的写端消息读端 常用术语ComponentChannelTaskNodeReader/WriterService/ClientParameter服务发现CRoutineSchedulerMessageDag文件Launch文件Record文件Mainboard Moni…