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

news2024/12/30 3:04:31

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.coloradmin.cn/o/1275360.html

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

相关文章

如何检查代理和防火墙设置

这样的错误可能会突然出现在个人计算机屏幕上,当访问您喜爱的网站时。这是什么原因,如何快速解决这个问题?我们将弄清楚如何检查。 关于访问问题 对网站的访问受阻实际上是一个非常常见的错误,它既可能是由于物理原因&#xff08…

建设银行RPA应用实践

当下,银行业正在从“互联网金融”时代向“新科技金融”时代迈进,在目前经济形势严峻、人力成本持续增加的经营背景下,以科技解放人力将是智能化银行发展的必然趋势。RPA技术为解决上述问题提供了崭新的路径。 RPA(机器人流程自动…

threejs教程

应群友要求出了个小白教程,此外也有进阶教程。 替代之前老版本的教程。 教程案例: 新教程地址:https://www.wellyyss.cn/ys-course/#/ 教程使用的是react搭建的 高级教程主要是案例 年底比较忙估计要晚一点才整合。 后续的计划是&#xff1…

onnx nvidia cuda cudnn driver 各种版本对应

onnx 和 nvidia cuda, nvidia cudnn 之间对应关系 NVIDIA - CUDA | onnxruntime # 查看cuda版本 nvcc -V# 查看cudnn版本 cat /usr/include/x86_64-linux-gnu/cudnn_v*.h | grep CUDNN_MAJOR -A 2

智慧安防三大信息技术:云计算、大数据及人工智能在视频监控EasyCVR中的应用

说到三大信息技术大家都很清楚,指的是云计算、大数据和人工智能,在人工智能(AI)快速发展的当下,例如常见的大数据分析、人工智能芯片生产的智能机器人等等,在工作、生活、教育、金融、科技、工业、农业、娱…

CCC联盟数字车钥匙(七)——BLE连接流程

本文接上一篇CCC数字钥匙BLE概述,介绍BLE中相关连接流程的实现。 2、BLE流程 2.1 所有者配对连接建立 CCC中使用Bluetooth OOB(Out of Band, 带外)配对完成所有者配对、连接建立的流程。BLE设置分为以下两个子部分: BLE链路层连…

SQL手工注入漏洞测试(MySQL数据库-字符型)-墨者

———靶场专栏——— 声明:文章由作者weoptions学习或练习过程中的步骤及思路,非正式答案,仅供学习和参考。 靶场背景: 来源: 墨者学院 简介: 安全工程师"墨者"最近在练习SQL手工注入漏洞&#…

《冬日“峰“会,有情岁月》丰谷酒品鉴会以酒会友

近日,由四川广播电视台金熊猫教育管理有限公司、丰谷酒业联合呈现的《冬日“峰“会,有情岁月》丰谷酒品鉴会在成都市橡树林举行。 品鉴会上,来自建筑界相关人士齐聚一堂,共同探讨交流把酒言欢、共品丰谷美酒。 据悉,参加本次活动的嘉宾都是四川乃至全国建筑界相关人士,在就餐时…

Vue3 Router跳转传参

最近遇到这个问题router跳转传参,真是要了老命了。 根据网上各位大神给出的方法,试了 import { useRouter } from vue-routerconst router useRouter()//1. 无法跳转 router.push(name:,params:{})//2. 可以跳转, 但需要在定义router同时定义占位符&a…

搭建nfs文件目录共享

搭建nfs文件目录共享 一、简介 NFS,英文全称是Network File System,中文全称是网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源,在NFS应用中,本地NFS的客…

运算放大器和常见运放电路

关于运算放大器 运算放大器(Operational Amplifier), 简称运放, 是一种直流耦合, 差模输入, 单端输出(Differential-in, single-ended output)的高增益电压放大器件. 运放能产生一个比输入端电势差大数十万倍的输出电势. 因为刚发明时主要用于加减法等运算电路中, 因而得名运算…

微信号被封了怎么办

13-7 常在河边走,哪有不湿鞋,做为经常用微信做电商客服的,或者经常在微信上和顾客谈钱的,总是会被微信后台重点关注,一不小心就有可能被封号。 如果遇到太倒霉的时候,永久封号了,这个时候微信…

C++模板—函数模板、类模板

目录 一、函数模板 1、概念 2、格式 3、实例化 4、模板参数的匹配 二、类模板 1、定义格式 2、实例化 交换两个变量的值,针对不同类型,我们可以使用函数重载实现。 void Swap(double& left, double& right) {double tmp left;left ri…

WebDriver+Selenium实现浏览器自动化

前言 Selenium是一款可以自动化操作浏览器的开源项目,最初的目的是浏览器功能的自动化测试,但是随着项目的发展,人们根据它的特性也用来做一些更多的有意思的功能而不仅仅是UI的自动化测试工具。就像Selenium官方网站上描述的那样&#xff0…

python 使用reportlab打造29页图文并茂pdf(全网reportlab最强pdf自动化生成代码)

python 使用reportlab打造29页图文并茂pdf(全网reportlab最强pdf自动化生成代码) 这次项目所使用的代码如果同志们可以灵活使用,基本上可以解决百分之九十以上的pdf模板自动化生成。 最近博主,做了一个项目,使用reportlab制作pd…

【Linux】:信号(三)捕捉

信号捕捉 一.sigaction1.基本使用2.sa_mask字段 二.可重入函数三.volatile四.SIGCHLD信号 承接上文 果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号。由于信号处理函数的代码是在用户空间的,处理过程比较复杂,举例如下: 用户程序注册了SIGQUIT信…

【Python表白系列】无限弹窗,满屏表白代码来啦(完整代码)

文章目录 满屏表白代码环境需求完整代码详细分析系列文章 满屏表白代码 环境需求 python3.11.4PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需…

浮点运算误差

输出所有形如aabb的4位完全平方数(即前两位数字相等,后两位数字也相等) 解决这个问题首先需要表示aabb这个变量,只需要定义一个变量n存储即可,另一个问题就是如何判断n是否为完全平方数? 第一种思路是先求出…

100道接口测试面试题值得收藏!

HTTP, HTTPS协议 什么是DNSHTTP协议怎么抓取HTTPS协议说出请求接口中常见的返回状态码HTTP协议请求方式HTTP和HTTPS协议区别HTTP和HTTPS实现机有什么不同POST和GET的区别HTTP请求报文与响应报文格式什么是HTTP协议无状态协议?怎么解决HTTP协议无状态协议常见的POST提交数据方…

3D悬停相册

先上图 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>3D悬停相册</title><style>*{margin: 0;padding: 0;box-sizing: border-box;}body{display: flex;justify-cont…