opencv c++ 图像形态学操作

news2024/12/23 3:09:40

1、图像的形态学操作

        包括图像的腐蚀膨胀形态学梯度、顶帽、黑帽、分支主题、结构元素等操作。

        具体概念参考:(41条消息) 图像处理-形态学处理_Good@dz的博客-CSDN博客_图像处理 形态学

1.1、膨胀

        用3×3的核去扫描二值图像,当核与图像中的前景像素(值为1的像素)有交集时,则将二值图像中对应的卷积核中心位置的像素值置为1。

        拓展:卷积核可以为任意形状(除1×1),且重置点可以选用卷积核中的任意位置,有‘交集‘就对重置点位置像素置1。

        

 1.2、腐蚀

        用3×3的核去扫描二值图像,仅当核的与前景像素有完全重合区域时,将二值图像中对应的卷积核中心位置的像素保留,其余情况下,将中心位置的像素置0。

         拓展:卷积核可以为任意形状,且重置点可以选用卷积核中的任意位置。

        

         膨胀与腐蚀的区别:膨胀只要有交集就触发,而腐蚀必须是重置点与前景像素有完全重合区域才保留

1.3、开与闭

        开:腐蚀再膨胀,去除微小干扰块。

       

        闭:膨胀再腐蚀,填充闭合区域。

        

1.4、形态学梯度

        基本梯度:膨胀图 - 腐蚀图

        内梯度:原图 - 腐蚀图

        外梯度:膨胀图 - 原图

        这里opencv只能直接实现基本梯度,在使用API:morphologyEx  时,调用MORPH_GRADIENT方法即可。

        内梯度、外梯度没有直接的API,一般通过已有API间接实现

1.5、其余形态学操作

        顶帽:原图 - 开操作后的图

        黑帽:闭操作后的图 - 原图

        注:顶帽和黑帽操作用于获取图像中的微小细节

        击中击不中: 通过特定模板,仅当输入的图像中,有与模板一模一样的块时,被击中的输入图像区域才会被保留。

        使用API:morphologyEx  时,分别调用MORPH_TOPHAT 、MORPH_BLACKHAT、MORPH_HITMISS方法即可实现。

2、API

        定义核形状


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


shape——核的形状,可以定义矩形,十字形等形状,如下:


ksize——大小
anchor ——锚定点,即前文中的重置点。

 注:当设计到保留横线或竖线时,可以将核定义成1×n或者n×1的形状,从而去除其余形状的线。

Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 1), Point(-1, -1));

        腐蚀:

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() 
                    )	

         膨胀:


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

        通用:

void cv::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() 
                            )	

op ——形态学操作选用,如下:


iterations——重复腐蚀和膨胀的次数。
borderType ——边界类型
borderValue ——Border value in case of a constant border. The default value has a special meaning. 

3、代码

3.1、腐蚀膨胀代码:

void erode_dilate(Mat& image)
{
	Mat gray;
	cvtColor(image, gray, COLOR_BGR2GRAY);
	Mat binary;
	threshold(gray, binary, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);
	namedWindow("THRESH_OTSU", WINDOW_FREERATIO);
	imshow("THRESH_OTSU", binary);

	Mat dst1, dst2;
	//定义核
	int kernel_size = 5;
	Mat kernel = getStructuringElement(MORPH_RECT, Size(kernel_size, kernel_size), Point(-1, -1));
	//腐蚀
	erode(binary, dst1, kernel);
	namedWindow("erode", WINDOW_FREERATIO);
	imshow("erode", dst1);

	//膨胀
	dilate(binary, dst2, kernel);
	namedWindow("dilate", WINDOW_FREERATIO);
	imshow("dilate", dst2);
}

3.2、开闭:

void QuickDemo::open_close(Mat& image)
{
	Mat gray;
	cvtColor(image, gray, COLOR_BGR2GRAY);
	Mat binary;
	threshold(gray, binary, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);
	namedWindow("THRESH_OTSU", WINDOW_FREERATIO);
	imshow("THRESH_OTSU", binary);

	Mat dst1, dst2;
	//定义核
	int kernel_size = 5;
	Mat kernel = getStructuringElement(MORPH_RECT, Size(kernel_size, kernel_size), Point(-1, -1));
	//开
	morphologyEx(binary, dst1, MORPH_OPEN, kernel, Point(-1, -1), 1, 0);
	namedWindow("MORPH_OPEN", WINDOW_FREERATIO);
	imshow("MORPH_OPEN", dst1);

	//闭、
	morphologyEx(binary, dst2, MORPH_CLOSE, kernel, Point(-1, -1), 1, 0);
	namedWindow("MORPH_CLOSE", WINDOW_FREERATIO);
	imshow("MORPH_CLOSE", dst2);
}

 3.3、形态学梯度

注:在边缘提取应用中,梯度边缘后,会再进行二值化,从而获取更好的边缘图像。

void QuickDemo::shape_gradient(Mat& image)
{
	Mat gray;
	cvtColor(image, gray, COLOR_BGR2GRAY);

	Mat g1, g2, g3;
	Mat dst1, dst2;
	int kernel_size = 7;
	Mat kernel = getStructuringElement(MORPH_RECT, Size(kernel_size, kernel_size), Point(-1, -1));
	
	//基本梯度
	morphologyEx(gray, g1, MORPH_GRADIENT, kernel, Point(-1, -1), 1, 0);

	//膨胀
	morphologyEx(gray, dst1, MORPH_DILATE, kernel, Point(-1, -1), 1, 0);

	//腐蚀
	morphologyEx(gray, dst2, MORPH_ERODE, kernel, Point(-1, -1), 1, 0);

	//外梯度
	subtract(dst1, gray, g2);
	//内梯度
	subtract(gray, dst2, g3);

	namedWindow("基本梯度", WINDOW_FREERATIO);
	imshow("基本梯度", g1);

	namedWindow("外梯度", WINDOW_FREERATIO);
	imshow("外梯度", g2);

	namedWindow("内梯度", WINDOW_FREERATIO);
	imshow("内梯度", g3);

	//最后再进行二值化,获取更好的边缘图像,选用基本梯度示例
	Mat binary;
	threshold(g1, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
	namedWindow("二值化", WINDOW_FREERATIO);
	imshow("二值化", binary);
}

3.4、其余形态学操作(顶帽、黑帽、击中击不中)

         

void QuickDemo::other_method(Mat& image)
{
	Mat gray;
	cvtColor(image, gray, COLOR_BGR2GRAY);
	Mat binary;
	threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
	namedWindow("二值化", WINDOW_FREERATIO);
	imshow("二值化", binary);

	Mat dst1, dst2, dst3;
	int kernel_size = 5;
	Mat kernel_1 = getStructuringElement(MORPH_RECT, Size(kernel_size, kernel_size), Point(-1, -1));

	//顶帽
	morphologyEx(binary, dst1, MORPH_TOPHAT, kernel_1, Point(-1, -1), 1, 0);
	namedWindow("顶帽", WINDOW_FREERATIO);
	imshow("顶帽", dst1);
	//黑帽
	morphologyEx(binary, dst2, MORPH_BLACKHAT, kernel_1, Point(-1, -1), 1, 0);
	namedWindow("黑帽", WINDOW_FREERATIO);
	imshow("黑帽", dst2);

	//击中击不中
	Mat kernel_2 = getStructuringElement(MORPH_CROSS, Size(kernel_size, kernel_size), Point(-1, -1));
	morphologyEx(binary, dst3, MORPH_HITMISS, kernel_2, Point(-1, -1), 1, 0);
	namedWindow("击中击不中", WINDOW_FREERATIO);
	imshow("击中击不中", dst3);
}

 

 

 

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

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

相关文章

[附源码]JAVA毕业设计仟侬堂茶具网站(系统+LW)

[附源码]JAVA毕业设计仟侬堂茶具网站(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术&a…

LeetCode中等题之查找和替换模式

题目 你有一个单词列表 words 和一个模式 pattern,你想知道 words 中的哪些单词与模式匹配。 如果存在字母的排列 p ,使得将模式中的每个字母 x 替换为 p(x) 之后,我们就得到了所需的单词,那么单词与模式是匹配的。 &#xff0…

Git(第二篇)——Git的常见操作

Git(第二篇)——Git的常见操作 目录Git(第二篇)——Git的常见操作一、Git版本控制介绍组成结构图命令速查常用命令二、下载并安装GIT设置字体查询git三、码云上的操作码云配置环境注册账号登录码云创建仓库创建远程仓库(在码云官网…

通讯录管理系统

目录 1.系统需求 2.创建项目 3.菜单功能 4.退出功能 5.添加联系人 5.1设计联系人结构体、设计通讯录结构体 5.2main函数中创建通讯录 5.3封装添加联系人函数 5.4测试添加联系人 6.显示联系人 7.删除联系人 7.1封装检测联系人是否存在 7.2删除联系人,测试删除联…

当我们的执行 java -jar xxx.jar 的时候底层到底做了什么?

大家都知道我们常用的 SpringBoot 项目最终在线上运行的时候都是通过启动 java -jar xxx.jar 命令来运行的。 那你有没有想过一个问题,那就是当我们执行 java -jar 命令后,到底底层做了什么就启动了我们的 SpringBoot 应用呢? 或者说一个 S…

Redux使用详解(一) Redux的核心思想与基本使用

Redux 理解javascript纯函数 函数式编程中有一个非常重要的概念叫纯函数,JavaScript符合函数式编程的范式,所以也有纯函数的概念; 在react开发中纯函数是被多次提及的; 比如react中组件就被要求像是一个纯函数(为什么…

使用STM32F103C8T自制freejoy控制板

1. 软件准备 1.1 STM公司的官方工具: STM32 ST-LINK Utility 已经更名为 STM32CubeProgrammer STSW-LINK004 - STM32 ST-LINK utility (replaced by STM32CubeProgrammer) - STMicroelectronics 1.2 FreeJoyConfiguratorQt V1.7.1 这个是刷好固件后的配置、调…

D-025 DP硬件电路设计

DP硬件电路设计1 简介1.1 DP接口分类1.2 DP接口和HDMI接口的区别1.3 DP接口的优势2 硬件层3 接口定义4 原理图设计1 简介 Display是一种新型的标准化的数字式视频接口标准,其支持的功能与HDMI相似,但是其目标是作为HDMI的补充,而非取代。DP …

红队渗透靶场之SickOs1.1

靶场考察知识 shellshock漏洞 shellshock即unix系统下的bash shell的一个漏洞, Bash 4.3以及之前的版本在处理某些构造的环境变量时存在安全漏洞, 向环境变量值内的函数定义后添加多余的字符串会触发此漏洞, 攻击者可利用此漏洞改变或绕过环境限制,以执行任意的sh…

Notepad++ ,json 、xml 格式化插件安装不了 和 github 网站访问不了 最佳解决方案

文章目录1.背景:2. 解决方法:方法一:修改hosts方法二: 通过 Watt Toolkit 加速1.简介:2.安装步骤:1.背景: 最近notpad 安装 JSON 和 xml 格式化工具安装不上,发现插件的地址 github…

docker之数据卷(Data Volumes)dockerfile

这里写目录标题宿主机与容器之间的文件拷贝数据卷数据卷容器Dockerfile自定义centos,具备vim及ifconfig作用(体会学习Dockerfile的意义)自定义tomcat8(熟悉几乎所有的Dockerfile命令)宿主机与容器之间的文件拷贝 引言…

故障分析 | Greenplum 集群 standby 故障处理

作者:杨文 DBA,负责客户项目的需求与维护,没有擅长,会点数据库,不限于MySQL、Redis、Cassandra、GreenPlum、ClickHouse、Elastic、TDSQL等等。 本文来源:原创投稿 *爱可生开源社区出品,原创内容…

SM4分组密码算法

对称加密算法SM4SM4算法介绍一、SM4加密流程二、轮函数F1.合成置换T3.非线性变换τ2.线性变换L4.加密的结果总结SM4算法介绍 SM4.0于2013年3月被列为国家密码行业标准“GM/T 0002-2012《SM4分组密码算法》(原SMS4分组密码算法)”。2016年被列入国家标准…

blender assetBrowser 资产浏览器

文章目录简介.基础操作打开资产浏览器.标记资产.资产库位置设置与加载其他工程的资产库.为资产设置分类.设置资产的属性.根据类型筛选资产.标记材质为资产.标记天空盒材质为资产.标记动作为资产.简介. 1 类似于unity的预制体,可以直接从资产浏览器里拖出来 2 创建时…

什么是缓存架构,什么是后端分布式多级缓存架构,全文解析带你了解其中门道

文章目录浏览器缓存客户端缓存CDN缓存反向代理缓存本地缓存分布式缓存其他:缓存命中率缓存问题:缓存穿透缓存问题:缓存击穿缓存问题:缓存雪崩缓存问题:缓存一致性缓存的其他问题开篇01数据库缓存1.1.MySQL查询缓存1.2.…

CAS登录认证

CAS最基本的协议过程: 名词解释 Ticket Grangting Ticket(TGT) : TGT是CAS为用户签发的登录票据,拥有了TGT,用户就可以证明自己在CAS成功登录过。TGT封装了Cookie值以及此Cookie值对应的用户信息。用户在CAS认证成功后&#xff0c…

应用于供暖、供水管道等场景的一种智能控制阀

智能控制阀,顾名思义就是能够实现智能化控制功能的一种控制阀。它有什么用处呢? TSM-04V无线智能控制阀由锂亚电池供电、超长续航,具有无线远程配置功能,是一种高可靠性阀控设备。自带断码显示屏,可以查看设备的电量、…

在VScode中使用Jupyter Notebook的一些技巧

目录 一、VScode中Jupyter Notebook的优点 二、Cell命令模式目前支持的Jupyter Notebook快捷 三、Cell编辑模式下支持的Vscode快捷键(只描述与编辑相关的那些快捷键)​​​​​​​ 一、VScode中Jupyter Notebook的优点 1.写py代码和使用Notebook经常…

DBCO-SS-Mal,DBCO-SS-Maleimide,马来酰亚胺衍生物试剂特点分析

一、基础产品数据(Basic Product Data): CAS号:N/A 中文名:二苯并环辛炔-二硫键-马来酰亚胺 英文名:DBCO-SS-Maleimide,DBCO-SS-Mal二、详细产品数据(Detailed Product Data&#xf…

aws 整理和理解aws的虚拟化技术

资料 Introduce_to_virtualizationKVM I/O虚拟化AWS EC2 Virtualization 2017: Introducing Nitro从AWS转向KVM,再看KVM与XEN的技术路线之争 简单整理并了解下和aws相关的虚拟化技术 虚拟化技术 相关概念 Hypervisor Hypervisor是一种运行在物理服务器和操作系…