《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.hqwc.cn/news/238579.html

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

相关文章

前端面试高频考点—事件循环Event loop

目录 事件循环 执行步骤 概念讲解 主线程 微任务(micro task) 宏任务(macro task) Event Loop经典例题 这段代码的执行结果是什么? 正确答案: 具体流程: 事件循环 主线程从"任务队列"中读取执行事件,这个过程…

利用 NRF24L01 无线收发模块实现传感器数据的无线传输

NRF24L01 是一款常用的无线收发模块,适用于远程控制和数据传输应用。本文将介绍如何利用 NRF24L01 模块实现传感器数据的无线传输,包括硬件的连接和配置,以及相应的代码示例。 一、引言 NRF24L01 是一款基于 2.4GHz 射频通信的低功耗无线收发…

RHCE学习笔记(RHEL8) - RH294

Chapter Ⅰ 介绍Ansible ansible ansible是一款开源自动化平台 ansible围绕一种无代理架构构建,在控制节点上安装ansible,且客户端不需要任何特殊的代理软件;ansible使用SSH等标准协议连接受管主机,并在受管主机上运行代码或命令来确保他们处于ansible指定的状态 Ansible帮…

[每周一更]-(第75期):Go相关粗浅的防破解方案

Go作为编译语言,天然存在跨平台的属性,我们在编译完成后,可以再不暴露源代码的情况下,运行在对应的平台中,但是 还是架不住有逆向工程师的反编译、反汇编的情形;(当然我们写的都不希望被别人偷了…

oops-framework框架 之 创建项目(二)

引擎: CocosCreator 3.8.0 环境: Mac Gitee: oops-game-kit 构建 本篇博客将使用oops-game-kit 构建一个新的开发项目, 关于 oops-framework 框架的了解,可参考上篇博客: oops-framework框架 之 初始了解(一) 大概…

『 Linux 』环境变量

文章目录 🚀什么是环境变量🚀🚀查看环境变量🚀🕹️和环境变量有关的命令🕹️ 🚀PATH环境变量🚀🕹️设置PATH环境变量🕹️ 🚀HOME环境变量&#x1…

redis主从复制模式和哨兵机制

目录 第一章、主从复制模式1.1)Redis 主从复制模式介绍1.2)Redis 主从复制实现、 第二章、哨兵机制2.1)容灾处理之哨兵2.2)Sentinel 配置 第一章、主从复制模式 1.1)Redis 主从复制模式介绍 ①单点故障:数…

ASP.NET Core 使用IIS调试出现505.24错误

最近一直再学习asp.net 相关的东西&#xff0c;主要是为前端app提供一个webapi接口。在使用iis调试程序时出现HTTP Error 500.24 - Internal Server Error错误&#xff0c;搞了好久才最终解决。 1.在项目中增加web.config配置文件 2.将配置文件改为如下内容 <?xml version…

【蓝桥杯软件赛 零基础备赛20周】第6周——栈

文章目录 1. 基本数据结构概述1.1 数据结构和算法的关系1.2 线性数据结构概述1.3 二叉树简介 2. 栈2.1 手写栈2.2 CSTL栈2.3 Java 栈2.4 Python栈 3 习题 1. 基本数据结构概述 很多计算机教材提到&#xff1a;程序 数据结构 算法。 “以数据结构为弓&#xff0c;以算法为箭”…

Vue3 的 inject 和 provide (附源码)

一&#xff1a;前言 在前端项目中牵扯的最多的莫过于组件之间的传值了&#xff0c;除了最最常用的 props 和 emit&#xff0c;其实在 Vue 中还额外提供了另外几种方法。今天分享一种组件之间通信的方法&#xff1a;provide 和 inject。 二&#xff1a;使用 1、目录结构 以下是…

网页开发 JS基础

目录 JS概述 基本语法 数据类型内置方法 DOM对象 查找标签 绑定事件 操作标签 jQuery 查找标签 绑定事件 操作标签 Ajax请求 数据接口 前后端分离 ajax的使用 JS概述 一门弱类型的编程语言,属于基于对象和基于原型的脚本语言. 1 直接编写<script>console…

在 AlmaLinux9 上安装Oracle Database 23c

在 AlmaLinux9 上安装Oracle Database 23c 0. 下载 Oracle Database 23c 安装文件1. 安装 Oracle Database 23c3. 连接 Oracle Database 23c4. &#xff08;谨慎&#xff09;卸载 Oracle Database 23c 0. 下载 Oracle Database 23c 安装文件 版权问题&#xff0c;下载地址请等待…