opencv_c++学习(十九)

news2025/1/18 13:59:52

一、图像间的距离变换

三种常用的距离计算方法:
在这里插入图片描述
欧式距离这里就不在解释。
街区距离:顾名思义,就类似于城市距离一样,并不是通过两点间的距离,而是我们从一个地点到达另一个地点的路程(横纵坐标差值之和)。
棋盘距离:是两点横纵坐标之差的最大值。
距离变换函数:

distanceTransform(InputArray src, OutputArray dst,int distanceType, int maskSize, int dstType = cv_32F)

src:输入图像,数据类型为CV_8U的单通道图像。
dst:输出图像,与输入图像具有相同的尺寸,数据类型为CV_8U或者CV_32F的单通道图像。
distanceType:选择计算两个像素之间距离方法的标志。
maskSize:距离变换掩码矩阵大小,可以选择尺寸为DIST_MASK_3(3×3)、DIST_MASK_5 (5×5)
dstType:输出图像的数据类型,可以是CV_8U或者CV_32F。
应用案例如下:

int main() {

	//定义一个建议矩阵,用于演示
	Mat a = (Mat_<uchar>(5, 5) << 1, 1, 1, 1, 1,
		1, 1, 1, 1, 11,
		1, 1, 0, 1, 1,
		1, 1, 1, 1, 1,
		1, 1, 1, 1, 1);

	Mat dist_L1, dist_L2, dist_C, dist_L12;

	//计算街区距离
	distanceTransform(a, dist_L1, 1, 3, CV_8U);
	cout << dist_L1 << endl;

	//计算欧式距离
	distanceTransform(a, dist_L2, 2, 5, CV_8U);
	cout << dist_L2 << endl;

	//计算棋盘距离
	distanceTransform(a, dist_C, 3, 5, CV_8U);
	cout << dist_C << endl;

	//对图像进行距离变换
	//读取图片
	Mat src = imread("图片1.png", IMREAD_GRAYSCALE);
	if (src.empty())
	{
		printf("不能打开空图片");
		return -1;
	}

	Mat src_BW, srcBW_INV;

	//将图像转化为二值图像,同时把黑白区域颜色互换
	threshold(src, src_BW, 50, 255, THRESH_BINARY);
	threshold(src, srcBW_INV, 50, 255, THRESH_BINARY_INV);

	//根据距离变换进行距离计算
	Mat dist, dist_INV;

	//CV_32F可以使图像变的更清晰
	distanceTransform(src_BW, dist, 1, 3, CV_32F);
	distanceTransform(srcBW_INV, dist_INV, 1, 3, CV_8U);

	imshow("w", src_BW);

	waitKey(0); 
	return 0;
}

二、图像形态学——腐蚀操作

在这里插入图片描述
图像腐蚀原理:
在这里插入图片描述
将结构元素的中心点放置在非零像素中,如果结构元素覆盖的范围存在零像素。则删除此时结构元素中心点所在位置元素,再进行平移操作,以此类图。
函数接口:

getStructuringElement(int shape, Size ksize, Point anchor = point(-1,-1))

shape:结构元素的种类。
ksize:结构元素的尺寸大小
anchor:中心点的位置,默认参数为结构元素的几何中心点。
函数生成的结构元素如下:
在这里插入图片描述
图像腐蚀操作函数:

erode(lnputArray src, OutputArray dst, lnputArray 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:腐蚀的次数。
borderType:像素外推法选择标志。
borderValue:边界不变的边界值。
图像腐蚀操作案例:

int main() {

	//读取图片
	Mat src = imread("图片1.png", IMREAD_ANYCOLOR);
	if (src.empty())
	{
		printf("不能打开空图片");
		return -1;
	}

	Mat erode_black1, erode_black2;

	//开始图像腐蚀操作
	//定义结构元素
	Mat struct1, struct2;
	//3*3大小的矩形结构元素
	struct1 = getStructuringElement(0, Size(3, 3));
	//3*3大小的十字结构元素
	struct1 = getStructuringElement(1, Size(3, 3));

	//腐蚀操作
	erode(src, erode_black1, struct1);
	erode(src, erode_black2, struct2);

	imshow("w", erode_black1);
	imshow("q", erode_black2);

	waitKey(0);
	return 0;
}

三、图像形态学——膨胀操作

在这里插入图片描述
与图像腐蚀相反,这里就不再赘述。
结构元素生成函数:

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

shape:结构元素的种类。
ksize:结构元素的尺寸大小
anchor:中心点的位置,默认参数为结构元素的几何中心点。
在这里插入图片描述
图像膨胀操作函数:

dilate(lnputArray src, OutputArray dst, lnputArray kernel, Point anchor = Point(-1,-1), int iterations = 1, int borderType = BORDER_cONSTANT, const Scalar & borderValue = morphologyDefaultBordervalue())

src:输入的待膨胀图像,图像的通道数可以是任意的,但是图像的数据类型必须是CV_8U,CV_160,cV_16S,cV_32F或CV_64F之一。
dst:腐蚀后的输出图像,与输入图像src具有相同的尺寸和数据类型。
kernel:用于膨胀操作的结构元素,可以自己输入,也可以用getStructuringElement()函数生成。anchor:中心点在结构元素中的位置,默认参数为结构元素的几何中心点。
iterations:腐蚀的次数。
borderType:像素外推法选择标志。
borderValue:边界不变的边界值。
膨胀函数的使用案例:

int main() {

	//读取图片
	Mat src = imread("图片1.png", IMREAD_ANYCOLOR);
	if (src.empty())
	{
		printf("不能打开空图片");
		return -1;
	}

	Mat erode_black1, erode_black2;

	//开始图像腐蚀操作
	//定义结构元素
	Mat struct1, struct2;
	//3*3大小的矩形结构元素
	struct1 = getStructuringElement(0, Size(3, 3));
	//3*3大小的十字结构元素
	struct1 = getStructuringElement(1, Size(3, 3));

	//膨胀操作
	dilate(src, erode_black1, struct1);
	dilate(src, erode_black2, struct2);

	imshow("w", erode_black1);
	imshow("q", erode_black2);

	waitKey(0);
	return 0;
}

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

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

相关文章

每日学术速递5.21

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Going Denser with Open-Vocabulary Part Segmenta 标题&#xff1a;通过开放式词汇部分分割变得更密集 作者&#xff1a;Peize Sun, Shoufa Chen, Chenchen Zhu, Fanyi Xiao, Pi…

代码随想录算法训练营第十三天|239. 滑动窗口最大值、347.前 K 个高频元素

滑动窗口最大值 题目链接&#xff1a;力扣 知识点&#xff1a;单调队列 解题思路&#xff1a; 需要一个队列&#xff0c;放进去窗口里的元素&#xff0c;然后随着窗口的移动&#xff0c;队列也一进一出&#xff0c;每次移动之后&#xff0c;队列告诉我们里面的最大值是什么…

Java基础-Java常用类1(包装类 + Object类)

本篇文章主要讲解Java的常用类 包装类Object类 希望能对你的复习以及面试有帮助,有错误请指正 , 感谢. 目录 包装类 Object类 Object 类的常见方法有哪些&#xff1f; 对象比较(hashcode和equals方法) 和 equals() 的区别 hashCode() 是什么 ? 有什么用&#xff1f; 那…

【数据分享】中国首套10米分辨率的建筑高度数据(tif格式)

建筑是城市最重要的构成要素&#xff0c;高密度高层数的建筑是城市区别于乡村的显著特征&#xff01;建筑数据也是我们在各项研究中都会使用到的数据&#xff01;之前我们分享过2020年全国90个城市市域范围的建筑体块数据&#xff08;可查看之前的文章获悉详情&#xff09;。 …

Ubuntu2004设置共享开发环境

我们都知道Linux操作系统是一个多用户的操作系统&#xff0c;由于大家在实际工作中很少接触到多用户环境&#xff0c;特别是在目前电脑硬件成本不断降低的情况下几乎每个从事IT行业的人员都有一台甚至多台个人PC&#xff0c;因此大家对多用户的理解并不深刻。 ChatGPT引燃了人…

【数据结构】堆堆堆堆堆!

目录 前言 树 树的概念 树的相关概念​编辑 树的表示 二叉树的概念 特殊的二叉树 ​ 二叉树的存储结构 堆 堆的建立(本篇以小堆为例&#xff0c;大堆实现方法一样&#xff09; 堆的结构定义 堆的初始化 堆的插入 堆的基础算法——向上调整算法 插入注意事项 堆的判…

Openai+Coursera: ChatGPT Prompt Engineering(三)

想和大家分享一下最近学习的Coursera和openai联合打造ChatGPT Prompt Engineering在线课程.以下是我写的关于该课程的前两篇博客&#xff1a; ChatGPT Prompt Engineering(一) ChatGPT Prompt Engineering(二) 今天我们来学习第三部分内容&#xff1a;推断(Inferring) 推断…

Android:IPC(进程间通信)机制

Android&#xff1a;IPC&#xff08;进程间通信&#xff09;机制 进程和线程 我们先来了解一些关于线程和进程基本的概念。 按照操作系统中的描述&#xff0c;线程是CPU调度的最小单元&#xff0c;同时线程是一种有限的系统资源。而进程一般指一个执行单元&#xff0c;在PC和…

(学习日记)AD学习 #2

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

npm ERR! code E404 在vscode安装插件时报错的解决方案

答主在配置commit代码提交规范时【即如下代码】遇到了以下问题 npm i cz-customizable6.3.0 --save-dev 出现了 npm ERR! code E404 npm ERR! 404 Not Found - GET https://registry.npmjs.org/vue%2fvue-loader-v15 - Not found npm ERR! 404 ……等报错情况 解决方案1 检查n…

SVN 导出改动差异文件

文章目录 SVN 导出改动差异文件应用场景/背景介绍具体操作方法 SVN 导出改动差异文件 应用场景/背景介绍 当然下面的两个场景介绍可能用分支管理都会有不错的效果&#xff0c;或者更优&#xff0c;只是记录一下思路&#xff0c;用什么还是看大家个人爱好啦 在开发过程中偶尔会…

nexus私服仓库maven-metadata.xml缺失导致的构建失败或者下载504

环境&#xff1a;maven项目&#xff0c;使用Nexus私服&#xff0c;jenkins实现代码的编译和打包。 问题分析思路&#xff1a;某周末前&#xff0c;jenkins上的编译打包任务一直正常工作&#xff0c;但周末后突然所有项目都编译失败&#xff0c;报错很一致都是Could not find a…

【牛客刷题专栏】0x30:JZ38 字符串的排列(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转)&#xff0c;它登陆后会保存刷题记录进度&#xff0c;重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏&#xff1a;个人CSDN牛客刷题专栏。 题目来自&#xff1a;牛客/题库 / 在线编程 / 剑指offer&#xff1a; 目录 前言问…

局域网与城域网 - ARP 地址解析协议

文章目录 1 概述2 ARP 地址解析协议2.1 工作过程2.2 报文格式2.3 ARP 命令 3 扩展3.1 网工软考真题 1 概述 #mermaid-svg-CQnNvTP8xFoJsztk {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-CQnNvTP8xFoJsztk .error-…

plt、fig、axes、axis的含义

plt import matplotlib.pyplot as plt figure,axes与axis 如果将Matplotlib绘图和我们平常画画相类比&#xff0c;可以把Figure想象成一张纸&#xff08;一般被称之为画布&#xff09;&#xff0c;Axes代表的则是纸中的一片区域&#xff08;当然可以有多个区域&#xff0c;这…

剑指 Offer - 字符串合辑

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340; 算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 题解目录 一、&#x1f331;[剑指 Offer 05. 替换空格](https://leetcode.cn/problems/t…

[笔记]C++并发编程实战 《二》线程管理

文章目录 前言第2章 线程管理2.1 线程管理的基础2.1.1 启动线程2.1.2 等待线程完成2.1.3 特殊情况下的等待2.1.4 后台运行线程2.2 向线程函数传递参数 前言 第2章 线程管理 本章主要内容 启动新线程等待线程与分离线程线程唯一标识符 好的&#xff01;看来你已经决定使用多…

使用压缩包安装jdk多版本并能领过切换

使用压缩包安装jdk多版本并能领过切换 1.下载2.解压包到指定位置3.使用pdate-alternatives 进行版本切换管理3.1. jdk173.2. jdk1.8 3.切换版本4.解决JAVA_HOME环境变量识别的问题 1.下载 官网的下载地址&#xff1a; 下载地址&#xff1a; jdk17: jdk1.8在当前页面的下面: …

基于差分进化算法的微电网调度研究(Matlab代码实现)​

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

MAC突然打不开Notion,你遇到过这个问题吗?

目录 解决办法 为什么Notion会突然打不开呢&#xff1f; Notion是一款适合记录/规划的应用&#xff0c;而且页面简洁&#xff0c;模板强大&#xff0c;深得大家喜爱。我也经常在Notion上制定计划、记录学习笔记等。不过&#xff0c;今天突然打不开了&#xff0c;网页版、本地…