《opencv实用探索·六》简单理解图像膨胀

1、图像膨胀原理简单理解

膨胀是形态学最基本的操作,都是针对白色部分(高亮部分)而言的。膨胀就是使图像中高亮部分扩张,效果图拥有比原图更大的高亮区域。

2、图像膨胀的作用
注意一般情况下图像膨胀和腐蚀是联合使用的。
(1)物体连接: 膨胀可以用于连接图像中间隔的物体部分。当图像中的物体有一些小的断裂或缝隙时,膨胀操作有助于将它们连接成一个整体;
(2)填充小孔: 膨胀可以填充物体内的小孔或空洞。在一些二值图像中,物体内部可能存在一些较小的空白区域,膨胀操作可以帮助填充这些小孔,使物体更加连续;
(3)增加物体大小: 膨胀操作会扩大图像中的物体。这在需要增加物体大小或加强物体边缘时很有用;
(4)去除小物体: 膨胀可以用于去除图像中一些小的噪声或不相关的物体。通过膨胀操作,较小的物体可能会被合并到周围较大的物体中,从而减小图像中不必要的小结构;
边缘检测,膨胀和腐蚀可以提取二值图像中的边缘信息,通过先膨胀在腐蚀可以是边缘更加明显;
(5)去除噪声,二值图像中可能存在一些噪声点,或者孤立的像素点,通过一定次数的腐蚀操作可以消除孤立的像素点,通过一定次数的膨胀操作可以填充小的噪声点;
(6)提取信息,通过膨胀和腐蚀操作可以提取文本区域。

3、膨胀的过程
膨胀与腐蚀相反,上一章提到腐蚀的过程:
用一个结构元素的中心覆盖原图像(二值图像只有0和1)的每个像素,看结构元素覆盖的原图像部分,取原图像中被覆盖部分像素的最小值替换被结构元素中心覆盖的原图像像素值。

而膨胀的过程:
用一个结构元素的中心覆盖原图像(二值图像只有0和1)的每个像素,看结构元素覆盖的原图像部分,取原图像中被覆盖部分像素的最大值替换被结构元素中心覆盖的原图像像素值。

下面演示下膨胀过程:
(1)先定义一个结构元素(核元素),通常是正方形、十字或圆。以十字为例,如下图。
在这里插入图片描述

定义一个原图像如下图(灰色区域像素值都为1,白色区域像素值都为0):
在这里插入图片描述
现在把核中心放在第一个像素,如下图:
由于第一行第一列,第一行第二列和第二行第一列都被核元素覆盖,并且这三个位置原图像像素值最大都为0,那么把0替换核中心覆盖的位置,即把原图像第一行第一列像素值置为0。
在这里插入图片描述

继续把核中心放在第二个像素,如下图:
原图像第一行第一列,第一行第二列,第一行第三列和第二行第二列都被核元素覆盖,且原图像像素值最大都是0,核中心在第一行第二列,那么把原图像该位置置为0
在这里插入图片描述

用上面方法在原图像第一行被膨胀后变为如下图样:
在这里插入图片描述

第二行就以第二行第二列位置的像素为例,把核元素覆盖上去,如下图:
这时候可以看到原图像被核元素覆盖的部分,在第三行第二列原图像像素值最大是1,那么把核元素中心位置即第二行第二列原图像像素值置为1
在这里插入图片描述

最后通过上面的方法膨胀原图像最终的效果如下:
在这里插入图片描述

4、opencv接口使用:

该函数用于生成常用的结构元素图像。

Mat cv::getStructuringElement(int  shape,Size  ksize,Point  anchor = Point(-1,-1) )

shape:结构元素的种类,如下图
在这里插入图片描述
下图从左到右依次是矩形结构元素(膨胀后的图像细节为矩形)、十字结构元素(膨胀后的图像细节为十字)和椭圆结构元素(膨胀后的图像细节为椭圆形):
在这里插入图片描述
矩形核使用场景:适用于大多数情况,特别是当你希望简单地扩大物体、连接物体或填充小孔时;
十字核使用场景:适用于连接断开的物体部分,例如去除小的断裂或连接一些窄的部分,有助于保留物体的纵向结构;
椭圆核使用场景:适用于处理具有方向性的物体,或者在需要更平滑地扩展物体边缘时或在处理一些非常小的或弯曲的物体时可能更有效。

ksize:结构元素的尺寸大小,一般情况下,结构元素的种类相同时,结构元素的尺寸越大膨胀效果越明显。
anchor:中心点的位置,默认参数为结构元素的几何中心点。

该函数用于生成膨胀后的图像。

CV_EXPORTS_W void dilate( InputArray src, OutputArray dst, InputArray kernel,Point anchor=Point(-1,-1), int iterations=1,int borderType=BORDER_CONSTANT,const Scalar& borderValue=morphologyDefaultBorderValue() );

src:输入的待膨胀图像,图像的通道数可以是任意的,但是图像的数据类型必须是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。
dst:膨胀后的输出图像,与输入图像src具有相同的尺寸和数据类型。
kernel:用于膨胀操作的结构元素,可以自己定义,也可以用getStructuringElement()函数生成。
anchor:中心点在结构元素中的位置,默认参数为结构元素的几何中心点
iterations:膨胀的次数,默认值为1。膨胀次数越多效果越明显。
borderType:用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_CONSTANT。
borderValue:使用边界不变外推法时的边界值。

最后两个参数对图像中主要部分的膨胀操作没有影响,因此在多数情况下使用默认值即可。
需要注意的是该函数的膨胀过程只针对图像中的非0像素,如果图像注意以0像素为背景(背景基本黑色),那么膨胀操作后会看到图像中的内容变得更粗更大;如果图像是以255像素为背景(背景基本白色),那么膨胀操作后会看到图像中的内容变得更细更小。

案例使用:

int main() {//载入原图  Mat srcImage = imread("1.jpg");//显示原图imshow("【原图】膨胀操作", srcImage);//进行膨胀操作 Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));Mat dstImage;dilate(srcImage, dstImage, element);//显示效果图 imshow("【效果图】膨胀操作", dstImage);waitKey(0);return 0;
}

效果如下:
原图像:
在这里插入图片描述

膨胀后的图像:
在这里插入图片描述

5、有关形态学的应用
图像形态学腐蚀可以将细小的噪声区域去除,但是会将图像主要区域的面积缩小,造成主要区域的形状发生改变。图像形态学膨胀可以扩充每一个区域的面积,填充较小的空洞,但是会增加噪声的面积。根据两者的特性,将图像腐蚀和膨胀适当结合,便可以既去除图像中的噪声,又不缩小图像中主要区域的面积;既填充较小的空洞,又不增加噪声的面积

(1)开运算
图像开运算可以去除图像中的噪声,消除较小连通域,保留较大连通域,同时能够在两个物体纤细的连接处将两个物体分离,并且在不明显改变较大连通区域面积的同时能够平滑连通域的边界。

开运算:先腐蚀,消除图像中的噪声和较小的连通域;后膨胀,弥补较大的连通域因腐蚀而造成的面积减小。

(2)闭运算
图像闭运算可以去除连通域内的小型空洞,平滑物体轮廓,连接两个临近的连通域。闭运算,先膨胀,填充连通域内小型空洞,扩大连通域边界,将临近的两个连通域连接;后腐蚀,减少由膨胀运算引起的连通域边界的扩大以及面积的增加。

开运算和闭运算可以通过分别调用dilate函数和erode函数进行实现,也可以使用morphologyEx函数实现。函数原型:

CV_EXPORTS_W void morphologyEx( InputArray src, OutputArray dst,int op, InputArray kernel,Point anchor=Point(-1,-1), int iterations=1,int borderType=BORDER_CONSTANT,const Scalar& borderValue=morphologyDefaultBorderValue() );

src 输入图像,图像位深应该为以下五种之一:CV_8U, CV_16U,CV_16S, CV_32F 或CV_64F;
dst 输出图像,需和源图片保持一样的尺寸和类型;
op 表示形态学运算的类型;
kernel 表示结构元素,配合getStructuringElement函数使用。
anchor:中心点在结构元素中的位置,默认参数为结构元素的几何中心点
iterations:处理次数,默认值为1。
borderType:用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_CONSTANT。
borderValue:使用边界不变外推法时的边界值。

注意,第三个参数是形态学操作类型的标志:

//! type of morphological operation
enum MorphTypes{MORPH_ERODE    = 0, //腐蚀MORPH_DILATE   = 1, //膨胀MORPH_OPEN     = 2, //开运算MORPH_CLOSE    = 3, //闭运算MORPH_GRADIENT = 4, //形态学梯度MORPH_TOPHAT   = 5, //顶帽运算MORPH_BLACKHAT = 6, //黑帽运算MORPH_HITMISS  = 7  //击中击不中bian
};
在这里插入图片描述

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

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

相关文章

scrapy介绍,并创建第一个项目

一、scrapy简介 scrapy的概念 Scrapy是一个Python编写的开源网络爬虫框架。它是一个被设计用于爬取网络数据、提取结构性数据的框架。 Scrapy 使用了Twisted异步网络框架,可以加快我们的下载速度。 Scrapy文档地址:http://scrapy-chs.readthedocs.io/z…

【.net core 7】新建net core web api并引入日志、处理请求跨域以及发布

效果图: 1.新建.net core web api项目 选择src文件夹》添加》新建项目 输入框搜索:web api 》选择ASP.NET Core Web API 输入项目名称、选择位置为项目的 src文件夹下 我的项目是net 7.0版本,实际选择请看自己的项目规划 2.处理Progr…

SpringBoot Bean解析

Bean解析 IOC介绍 松耦合灵活性可维护 注解方式配置Bean 实现方式1: Component声明,直接类上进行添加注解, 同时保证包扫描能扫到即可实现方式2: 配置类中使用Bean Configuration public class BeanConfiguration implements SuperConfiguration{Bean("dog")Ani…

基于DigiThread的仿真模型调参功能

仿真模型调参是指通过调整模型内部的参数值,使仿真模型的输出更符合实际系统的行为或者预期结果的过程。 仿真过程中,往往需要频繁对模型参数进行调整,通过观察不同参数下系统整体的运行情况,实现系统的性能、可靠性和效率的优化…

一小时玩转【负载均衡】

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD 如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。 😊 座右铭:不…

初中数学网上考试系统的设计与实现

摘 要: 科技在人类的历史长流中愈洗愈精,不仅包括人们日常的生活起居,甚至还包括了考试的变化。之前的考试需要大量的时间和精力,组织者还需要挑选并考查结果,以及为了强制有效地进行考试所需要采取的一些步骤&#x…

RocketMQ Copilot 一款面向 Apache RocketMQ 的智能辅助运维系统

一、RocketMQ简介 ocketMQ是阿里巴巴研发的一款分布式消息中间件,后开源给Apache基金会,成为apache的顶级开源项目。它具有高性能、高可靠、高实时和分布式的特点。RocketMQ主要应用于解决应用耦合,消息分发,流量削锋等问题。 R…

Java零基础——vue篇

1.【熟悉】Vue简介 1.1 简介 它是一个构建用户界面的框架 Vue是一个前端框架 js jq https://www.pmdaniu.com/#file UI网站 UI 一般开发者使用蓝湖 工具 看着UI图 写接口 https://lanhuapp.com/web/#/item 是一个轻量级的MVVM(Model-View-ViewModel&#xff0…

(使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))

使用vite搭建vue3项目(vite vue3 vue router pinia element plus) 初始化项目安装依赖,运行项目初始配置 初始化项目 1.需要在创建项目的位置cmd目录下执行 2. npm init vitelatest 回车 npm init vitelatest3.填上自己的项目名称 回车…

【开源】基于JAVA的厦门旅游电子商务预订系统

项目编号: S 030 ,文末获取源码。 \color{red}{项目编号:S030,文末获取源码。} 项目编号:S030,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 景点类型模块2.2 景点档案模块2.3 酒…

[网鼎杯 2020 青龙组]singal 1

前言 在主函数中找到了一个vm的译码器,译码器主要是解释传入的opcode,然后对我们输入的字符操作,这里我们发现他是单字节比较的,方法很多可以使用单字节映射,也可以是使用符号化执行,当然也可以硬着头皮去…

canvas基础:渲染文本

canvas实例应用100 专栏提供canvas的基础知识,高级动画,相关应用扩展等信息。 canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重要的帮助。 文章目录 示例…

Postman如何导入和导出接口文件

本文介绍2种导出和导入的操作方法:一种是分享链接,导入链接的方式(需要登录);另一种是导出json文件,再次导入。下面将详细介绍。 由于第一种分享链接,导入链接的方式需要登录,所以推…

KNN回归-GridSearchCV模型调优(波士顿房价)

数据集简介 数据介绍 波士顿房价数据集(Boston Housing Dataset) 是一个经典的用于回归分析的数据集。它包含了波士顿地区506个街区的房价信息以及与房价相关的13个特征。这个数据集的目标是根据这些特征来预测波士顿地区房屋的中位数价格(以千美元为单位) 数据说明 Data S…

Vue 3.0 组合式API 生命周期钩子

文章目录 前言配置项api图表on配置项api后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:vue.js 🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误&#xff0…

微软 Power Platform 零基础 Power Pages 网页搭建教程学习实践进阶以及常见问题解答(二)

微软 Power Platform 零基础 Power Pages 网页搭建教程学习实践进阶及常见问题解答(二) Power Pages 学习实践进阶 微软 Power Platform 零基础 Power Pages 网页搭建教程学习实践进阶及常见问题解答(二)Power Pages 核心工具和组…

【AUTOSAR】【通信栈】IPduM

AUTOSAR专栏——总目录_嵌入式知行合一的博客-CSDN博客文章浏览阅读310次。本文主要汇总该专栏文章,以方便各位读者阅读。https://xianfan.blog.csdn.net/article/details/132072415 目录 一、概述 二、相关模块 2.1 OS

2023年第十二届数学建模国际赛小美赛B题工业表面缺陷检测求解分析

2023年第十二届数学建模国际赛小美赛 B题 工业表面缺陷检测 原题再现: 金属或塑料制品的表面缺陷不仅影响产品的外观,还可能对产品的性能或耐久性造成严重损害。自动表面异常检测已经成为一个有趣而有前景的研究领域,对视觉检测的应用领域有…

成倍提高生产力工具Notion

成倍提高生产力工具Notion Notion已经成为了很多内容创作者的唯一生产力工具,甚至很多企业已经把Notion当作他们的唯一的工作平台,学习这款软件不仅能提高你的工作效率甚至在职场上也会成为一个吃香的技能,在美国有人制作销售Notion模板&…

人工智能基础创新的第二增长曲线

编者按:2023年是微软亚洲研究院建院25周年。借此机会,我们特别策划了“智启未来”系列文章,邀请到微软亚洲研究院不同研究领域的领军人物,以署名文章的形式分享他们对人工智能、计算机及其交叉学科领域的观点洞察及前沿展望。希望…