《opencv实用探索·五》opencv小白也能看懂的图像腐蚀-程序员宅基地

技术标签: c++  opencv实用学习  计算机视觉  图像处理  人工智能  opencv  

1、图像腐蚀原理简单理解:
腐蚀是形态学最基本的操作,都是针对白色部分(高亮部分)而言的。即原图像中高亮部分被蚕食,得到比原图更小的区域。

2、图像腐蚀的作用:
(1)去掉毛刺,去掉孤立的像素,提取骨干信息。
(2)边缘检测,膨胀和腐蚀可以提取二值图像中的边缘信息,通过先膨胀在腐蚀可以是边缘更加明显;
(3)去除噪声,二值图像中可能存在一些噪声点,或者孤立的像素点,通过一定次数的腐蚀操作可以消除孤立的像素点,通过一定次数的膨胀操作可以填充小的噪声点;
(4)提取信息,通过膨胀和腐蚀操作可以提取文本区域;

3、腐蚀的过程
用一个结构元素的中心覆盖原图像(二值图像只有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:中心点的位置,默认参数为结构元素的几何中心点。

该函数用于生成腐蚀后的图像。

void cv::erode(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:像素外推法选择标志,取值范围在表3-5中给出。默认参数为BORDER_DEFAULT,表示不包含边界值倒序填充。
borderValue:使用边界不变外推法时的边界值。

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

案例使用:

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

	return 0;
}

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

腐蚀后的图像:
在这里插入图片描述

在这里插入图片描述
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cs1395293598/article/details/134716765

智能推荐

小白上路_小白成功上路-程序员宅基地

文章浏览阅读220次。这是我算是正式进入这个行业的第一份工作,这篇博客也算是我作为程序员的第一篇博客。心里很激动,用很多话想说,但是又不知道该从何说起。从开始因为自己的一点兴趣,和家里商量之后学习了一个可以说是和我大学专业没什么关系的java开始,因为不是计算机专业的科班出身,所以当一开始的兴趣被各种专业名词、属于、逻辑消耗殆尽时,真的怀疑过自己是不是干这个的材料,怀疑自己是不是做了一个错误的决定,走了一条根本不属于我..._小白成功上路

使用python对微博评论进行分词、文本聚类_微博评论分词-程序员宅基地

文章浏览阅读1.6w次,点赞37次,收藏342次。分词、文本聚类前言一、事前准备二、分词、聚类1.读取文本内容2.jieba分词3.去停用词4.生成tfidf矩阵5.K-means聚类6.得出各分类文本的主题前言爬取了微博博文和发文时间后,进行简单的文本分析。总体思路:jieba分词、去停用词、K-means聚类、选出各类的主题词(附上我前面写的爬取微博内容的方法:python+selenium 爬取微博(网页版)并解决账号密码登录、短信验证 )这里简单起见,选择了104条文本。每行是微博博文、发文时间。一、事前准备python3.7、py_微博评论分词

nRF52832无协议栈下软件定时器的使用_nrf52832 sdk_config.h 无nrf_ble_scan_filter_enable-程序员宅基地

文章浏览阅读810次,点赞4次,收藏4次。nRF52832无协议栈下软件定时器的使用编译器及例程说明sdk_config.h配置说明一、日志初始化二、空闲状态处理三、LED GPIO配置四、定时器1超时处理五、定时器2超时处理六、定时器初始化七、启动定时器八、低频时钟配置(LFCLK)九、主函数十、例程结果编译器及例程说明1. nRF支持包 : NordicSemiconductor.nRF_DeviceFamilyPack.8.17.0.pack2. ARM支持包 : ARM.CMSIS.4.5.0.pack3. Toolchain _nrf52832 sdk_config.h 无nrf_ble_scan_filter_enable

php挂载webdav,phpweb服务器开启了WebDAV的关闭方法-程序员宅基地

文章浏览阅读450次。Microsoftwindows2000/XP及IE,Office还有Adobe/MacroMedia的DW等都支持Webdav,这又大大增强了Web应用的价值,以及效能。对于需要大量发布内容的用户而言,应用WebDav可以降低对CMS系统的依赖,而且能够更自由的进行创作。上传、下载变得轻松自如。Web 分布式创作和版本管理 (WebDAV) 扩展了 HTTP/1.1 协议,允许客户端发布、锁定和..._php访问webdav

IDEA左侧project模式下,不显示项目工程目录,只有几个配置文件_idea左侧为什么没有显示项目文件框架-程序员宅基地

文章浏览阅读6k次。I、问题原因一般为配置文件*.iml 出错了II、解决办法 方法1:找到 出错位置,修复 方法2:清除配置,重新导入 1)关闭IDEA, 2)删除项目文件夹下的.idea文件夹 3)重新用IDEA工具打开项目I、问题原因一般为配置文件*.iml 出错了..._idea左侧为什么没有显示项目文件框架

嵌入式系统网络socket套接字经常使用的网络通信协议?_socket 嵌入式c-程序员宅基地

文章浏览阅读471次。它提供可靠的、面向连接的通信,并确保数据按照正确的顺序和不丢失地传输。TCP/IP协议适用于对数据传输的可靠性和顺序有要求的场景,例如网页浏览、文件传输等。HTTP协议:HTTP(Hypertext Transfer Protocol)是一种基于TCP/IP的应用层协议,用于传输超文本数据,即网页数据。它适用于资源有限的嵌入式设备和传感器之间的通信,并具有低功耗和带宽效率高的特点。TCP/IP和UDP协议是最常见和通用的选择,HTTP协议适用于Web数据交互,而MQTT协议则适合物联网领域的通信需求。_socket 嵌入式c

随便推点

Linux服务器移动文件命令_linux移动文件命令-程序员宅基地

文章浏览阅读1w次,点赞2次,收藏7次。Linux服务器移动文件命令_linux移动文件命令

123-程序员宅基地

文章浏览阅读163次。阵容:4冰川(狂战士4、背叛者1、绝命巫师2、占卜师3) 占4人口3战士(船长4+随便一个战士,有钱就买末日审判官4) 占2人口2术士甚至4术士(灵魂收割4、暗之灵5、不免预言家5) 占1\3人口2刺客(光羽刺客4、幽影刺客3)刺客是有冰川加攻速也很厉害 占2人口阵容核心就是狂战士,2星是基本,3星就无敌。配合暗之灵可以融化对面。曾经的骑士的抗性持续3秒,6骑3龙+暗之灵...

OpenCV Learning: IplImage三个单通道与单个通道的转换_iplimage 通道转换-程序员宅基地

文章浏览阅读1.1k次。#include "stdafx.h" #include #include using namespace std; using namespace cv; int _tmain(int argc, _TCHAR* argv[]) { //从文件中读入图像 clock_t start,finish; start=clock_iplimage 通道转换

最优化方法:拉格朗日乘数法-程序员宅基地

文章浏览阅读344次。http://blog.csdn.net/pipisorry/article/details/52135854 解决约束优化问题——拉格朗日乘数法 拉格朗日乘数法(Lagrange Multiplier Method)应用广泛,可以学习麻省理工学院的在线数学课程。 拉格朗日乘数法的基本思..._优化问题的数学模型 拉格朗日 标准型

三维高斯积分点坐标及权系数表_高斯积分法 权系数表-程序员宅基地

文章浏览阅读2.6k次,点赞2次,收藏6次。Point x y z Weight 1 0 0 0 8 Point x y z Weight 1 -0.5773502692 -0.5773502692 0.5773502692 1.0000000000 2 0.5773502692 -0.5773502692 0.5773502692 1.0000000000 3 0.5773502692 0.5773_高斯积分法 权系数表

Python实战1-9例:变量、运算、字符串等综合训练_python字符串和变量练习题-程序员宅基地

文章浏览阅读822次。笔者:风起怨江南出处:https://blog.csdn.net/JackMengJin笔者原创,文章欢迎转载,转载请注明出处。如果喜欢请点赞+关注,感谢支持!《Python实战系列》所有实例训练题都是从Python各个知识点精挑细选出来的,大部分实例会在注释里给出解题思路,希望能对大家有所帮助。Python实战系列每周日更新,数量不等,但质量必须杠杠的!不多废话,直接上干货!..._python字符串和变量练习题

推荐文章

热门文章

相关标签