图像边缘检测原理

news2024/11/16 9:27:58

文章目录

  • 图像边缘检测原理
    • 1:
    • 2:
    • 3:基本边缘检测算子


图像边缘检测原理

1:

图像的边缘指的是图像中像素灰度值突然发生变化的区域,如果将图像的每一行像素和每一列像素都描述成一个关于灰度值的函数,那么图像的边缘对应在灰度值函数中是函数值突然变大的区域。函数值的变化趋势可以用函数的导数描述。当函数值突然变大时,导数也必然会变大,而函数值变化较为平缓区域,导数值也比较小,因此可以通过寻找导数值较大的区域去寻找函数中突然变化的区域,进而确定图像中的边缘位置。图5-27给出一张含有边缘的图像,图像每一行的像素灰度值变化可以用图中下方的曲线表示。

在这里插入图片描述

通过像素灰度值曲线可以看出图像边缘位于曲线变化最陡峭的区域,对灰度值曲线求取一阶导数可以得到图5-28中所示的曲线,通过曲线可以看出曲线的最大值区域就是图像中的边缘。
在这里插入图片描述在这里插入图片描述

图像的边缘有可能是由高像素值变为低像素值,也有可能是由低像素值变成高像素值,通过式(5.13)和式(5.14)得到的正数值表示需要像素值突然由低变高,得到的负数值表示像素值由高到低,这两种都是图像的边缘,因此为了在图像中同时表示出这两种边缘信息,需要将计算的结果求取绝对值。

2:

数字图像的边缘检测在图像处理中起着十分重要的作用,十分简单又有效的方法就是微分算子,常见的微分算子包括:Sobel算子、Robert算子、Prewitt算子、Laplacian算子、Canny算子。

从名字也可以看出,微分算子,当然涉及到求导,为什么对图像进行求导就可以检测图像中的边缘呢?图像的边缘一般存在灰度变化强烈的地方,只有灰度变化的明显我们才可以从图像中清晰的看到没有一个物体的轮廓,要是一个图像灰度变化很均匀的话,整个图像就变得比较模糊。就如把一副图像均值滤波以后,图像变得模糊了。如何表示一个图像的灰度变化,当然是求导了,梯度值越大表示图像中灰度值变化越剧烈,越有可能是图像的边缘。图像求导包括一阶和二阶,二阶导数比一阶导数在细节方面处理的更好一点,但是也各有利弊,如含有噪声的图像就不适合二阶导,因为他会把图像中的噪声增强,所以需要先做平滑处理。

下面看一下在图像中一阶导和二阶导是怎么求的。在数学中一维函数的一阶导数的概念如下:
在这里插入图片描述

图像是一个二维的函数 f(x,y),所以需要求偏微分:
在这里插入图片描述

因为图像是离散的像素点,所以其中的 Δx、 Δ y 不能无限小,所以按照只能按照像素为单位, Δ x = 1, Δy=1 ;然后可以知道上面的微分方程就变成了如下的形式
在这里插入图片描述

所以一副图像x方向和y方向的梯度就是连个相邻像素之间的差值。那么求整体的梯度公式就如下:
在这里插入图片描述

这样图像的一阶导就完事了,然后同样的,二阶导的推理如下:
在这里插入图片描述

所以令 x = −1,就可以得到
在这里插入图片描述

整体图像的二阶导:
在这里插入图片描述

3:基本边缘检测算子

在介绍完滤波的知识后,学习基本边缘检测算法是一件很轻松的事情,因为边缘检测本质上就是一种滤波算法,区别在于滤波器的选择,滤波的规则是完全一致的

为了更好理解边缘检测算子,我们引入梯度(gradient)这一概念,梯度是人工智能(artificial intelligence)非常重要的一个概念,遍布机器学习、深度学习领域,学过微积分的同学应该知道一维函数的一阶微分基本定义为:

在这里插入图片描述

而我们刚才也提到了,图像的滤波一般是基于灰度图进行的,因此图像此时是二维的,因此我们在看一下二维函数的微分,即偏微分方程:
在这里插入图片描述

由上面的公式我们可以看到,图像梯度即当前所在像素点对于X轴、Y轴的偏导数,所以梯度在图像处理领域我们可以也理解为像素灰度值变化的速度,下面我们举一个简单的例子:
在这里插入图片描述

图中我们可以看到,100与90之间相差的灰度值为10,即当前像素点在X轴方向上的梯度为10,而其它点均为90,则求导后发现梯度全为0,因此我们可以发现在数字图像处理,因其像素性质的特殊性,微积分在图像处理表现的形式为计算当前像素点沿偏微分方向的差值,所以实际的应用是不需要用到求导的,只需进行简单的加减运算

而另一个概念梯度的模则表示f(x, y),在其最大变化率方向上的单位距离所增加的量,即:
在这里插入图片描述

代码演示:

Mat img = imread("D:/OpenCV4.5.1/opencv/sources/doc/js_tutorials/js_assets/lena.jpg", IMREAD_GRAYSCALE);

	if (img.empty())
	{
		cout << "请确认图像文件名称是否正确" << endl;
		return -1;
	}

	// 创建边缘检测滤波器
	Mat kernel2 = (Mat_<float>(1, 3) << -1, 0, 1); // X方向边缘检测滤波器
	Mat kernel3 = (Mat_<float>(3, 1) << -1, 0, 1); // Y方向边缘检测滤波器

	Mat result1, result2, result3, result4, result5, result6;

	// 检测图像边缘

	// 以 [1 0 -1] 检测水平方向边缘
	filter2D(img, result2, CV_32F, kernel2);
	convertScaleAbs(result2, result2);

	// 以 [1 0 -1]' 检测由垂直方向边缘
	filter2D(img, result3, CV_32F, kernel3);
	convertScaleAbs(result3, result3);

	// 相加后整幅图像的边缘梯度
	result6 = result2 + result3;

	//先转换为浮点型,下面求平方开方会报错 类型不对
	result2.convertTo(result4, CV_32F);
	result3.convertTo(result5, CV_32F);

	// 求平方和再开方后整幅图像的边缘梯度
	pow(result4, 2.0, result4);
	pow(result5, 2.0, result5);
	sqrt(result4 + result5, result1);
	// 将 result1 归一化到 [0, 255] 范围内,不然直接显示 会超出255
	Mat result1_normalized;
	normalize(result1, result1_normalized, 0,  255, NORM_MINMAX, CV_8UC1);


	// 显示边缘检测结果
	imshow("X方向边缘", result2);
	imshow("Y方向边缘", result3);
	imshow("X+Y后整幅图像的边缘", result6);
	imshow("sqrt(X²+Y²)整幅图像的边缘", result1_normalized);

	waitKey(0);

在这里插入图片描述

利用Sobel算子一阶和31卷积和13卷积 实现上面一样的功能

    Mat img = imread("D:/OpenCV4.5.1/opencv/sources/doc/js_tutorials/js_assets/lena.jpg", IMREAD_GRAYSCALE);

	if (img.empty())
	{
		cout << "请确认图像文件名称是否正确" << endl;
		return -1;
	}

	Mat resultX, resultY, resultXY;

	//X方向一阶边缘
	Sobel(img, resultX, CV_16S, 1, 0, 1);
	convertScaleAbs(resultX, resultX);

	//Y方向一阶边缘
	Sobel(img, resultY, CV_16S, 0, 1, 1);
	convertScaleAbs(resultY, resultY);

	//整幅图像的一阶边缘
	resultXY = resultX + resultY;

	//显示图像
	imshow("resultX", resultX);
	imshow("resultY", resultY);
	imshow("resultXY", resultXY);


	

在这里插入图片描述

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

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

相关文章

Autoware 安装(踩坑指南)

Autoware 安装&#xff08;踩坑指南&#xff09; 【Autoware】2小时安装Autoware1.13&#xff08;保姆级教程&#xff09; Autoware入门学习&#xff08;二&#xff09;——Ubuntu18.04下的源码安装和配置 上面的两篇博客安装都异常顺利&#xff0c;甚至没有一点报错&#xff0…

AMEYA360代理线:艾睿红外热成像仪数据机房监测应用

数据信息时代&#xff0c;数据机房是企业重要的区域。近日某购物平台发生的数据机房宕机事故&#xff0c;引发关注。机房设备温度异常&#xff0c;使得系统崩溃&#xff0c;经济损失超亿元。红外热成像仪作为一种非接触式、精准度高、可视化的温度测量工具&#xff0c;为数据机…

【MyBatis 神级框架】从入门到进阶

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 1. 什么是 MyBatis 1.1 为什么要学MaBatis&am…

TikTok正测试AI聊天机器人Tako

该功能可以“从根本上改变应用程序中的搜索和导航” 原文链接&#xff1a;TikTok tests AI chatbot called Tako – The Verge TikTok正在测试一个名为Tako的AI聊天机器人&#xff0c;根据与The Verge共享的功能截图&#xff0c;它可以根据人们的问题推荐视频。 如果TikTok最…

总结:公有云产品之CDN

一、介绍 由于公司经常提供CDN相关概念&#xff0c;本文特地总结下。 二、产品说明 百度云的内容分发网络CDN是一款基于互联网的分布式服务平台&#xff0c;可以加速网络上的内容分发和传输&#xff0c;提高网络的稳定性和访问速度。 CDN主要通过将网站的静态和动态资源缓存…

读书笔记-《ON JAVA 中文版》-摘要17[第十七章 文件]

文章目录 第十七章 文件1. 文件和目录路径1.1 选取路径部分片段1.2 路径分析1.3 Paths的增减修改 2. 目录3. 文件系统4. 路径监听5. 文件查找6. 文件读写7. 本章小结 第十七章 文件 在丑陋的 Java I/O 编程方式诞生多年以后&#xff0c;Java终于简化了文件读写的基本操作。 在 …

手机APP测试流程规范模板

一、流程图 二、测试周期 9.25-10.5 1、测试资源 测试任务开始前&#xff0c;检查各项测试资源。 1.1、产品功能需求文档 1&#xff09;产品原型图 2&#xff09;产品效果图 3&#xff09;行为统计分析定义文档 4&#xff09;测试设备&#xff08;Android4.1-Android4.…

OWASP 之跨站脚本xss基础技能

OWASP 之跨站脚本xss基础技能 一.XSS概述二.漏洞危害三.XSS漏洞绕过方法1.手工测试XSS步骤2.常见xss3.绕过方法 四.xss防御方法a.CSP内容安全策略b.HttpOnlyc.输入输出检查d.使用防御函数 五.pikachu靶场1.反射型XSS&#xff08;get&#xff09;2.反射型XSS&#xff08;post&am…

PS如何把多张图片拼接到一张?

现在有多张图片如下 &#xff0c;如何拼接成为1张呢&#xff1f; 打开ps&#xff0c;在ps里面点击文件->自动->联系表。 在弹出来的联系表对话框中&#xff0c;点击选取&#xff0c;选择要拼接的图片。 选择好图片之后&#xff0c;设置宽度高度&#xff0c;宽度的话&…

List Label 28.003 2023 Crack

列表和标签 28.003 在 Web 报表设计器中添加新的图表类型&#xff0c;并支持 Embarcadero RAD Studio 11.3。 6月 16&#xff0c; 2023 - 16&#xff1a;38 新版本 特征 .NET 所有可用的 NuGet 包现在都有一个特殊的企业包和 ID&#xff0c;以确保包都来自一个包源&#xff0c;…

GeneGPT:用领域工具增强大型语言模型,以改善对生物医学信息的访问

文章目录 一、论文关键信息二、主要内容1. Motivations2. 解决方案关键3. 实验和结果 三、总结与讨论 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、论文关键信息 论文标题&#xff1a;GeneGPT: Augmenting Large Language Models with Domain …

代码审计——垂直越权详解

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 漏洞描述02 审计要点03 漏洞特征04 漏洞案例05 修复方案 01 漏洞描述 垂直越权&#xff0c;也称权限提升&#xff0c;是一种“基于URL的访问控制”设计缺陷引起的漏洞。 由于Web应用程序没有做权…

2023开放原子全球开源峰会——Intel专题探访

浩瀚宇宙&#xff0c;有光&#xff0c;朝着未来之境&#xff1b;万物之始&#xff0c;有道&#xff0c;启示智慧共荣&#xff1b;在多维赋能的时空里&#xff0c;见微知著&#xff0c;开放共享 &#xff0c;包罗万象&#xff1b;在抵达终点的路途中&#xff0c;彼此陪伴&#x…

《Java核心卷1》怎么样?读1,2章草记 | 第12版

文章目录 《Java核心技术卷 一》第一章 概述第二章 Java编程环境 图书推荐 《Java核心技术卷 一》 第一章 概述 前言&#xff1a;本书与一些”0基础入门“的书定位感觉是不太一样的&#xff0c;可能就像书名所说&#xff0c;是”核心技术“叭。书中经常将Java语言与 c 进行对比…

基于Java电子竞技管理平台设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

详解c++---红黑二叉树的原理和实现

什么是红黑二叉树树 avl树是通过控制平衡因子来控制二叉搜索树的平衡&#xff0c;当某个节点的平衡因子等于2或者-2的话我们就根据他所在的位置来进行旋转&#xff0c;如果这个节点位于右右的话就对其进行向左旋转&#xff0c;如果这个节点位于左左的话就对其进行向右旋转&…

【Android复习笔记】OkHttp核心原理

使用方法 调用流程 0kHttp请求过程中最少只需要接触OkHttpClient、Request、Call、 Response,但是框架内部进行大量的逻辑处理。 所有的逻辑大部分集中在拦截器中,但是在进入拦截器之前还需要依靠分发器来调配请求任务。 分发器:内部维护队列与线程池,完成请求调配;拦截…

chatgpt赋能python:Python中嵌套列表的访问方法

Python中嵌套列表的访问方法 在Python编程中&#xff0c;嵌套列表是一种很常见的数据类型。它可以存储多个列表&#xff0c;使得数据结构更加复杂灵活。然而&#xff0c;如何访问嵌套列表中的元素呢&#xff1f;本文将详细介绍Python中嵌套列表的访问方法。 嵌套列表的定义 …

ch8_2_CPU的指令周期

1.  指令周期 指令周期是指_ CPU从主存取出一条指令, 分析指令&#xff0c;加上执行这条指令的时间。 1.1指令周期 指令周期&#xff1a; 是指cpu&#xff0c;从内存中取出指令&#xff0c;并且执行一条指令所需要的全部时间。 比如 从内存单元中&#xff0c;取出操作数&…

【备战秋招】每日一题:4月29日美团春招第二题:题面+题目思路 + C++/python/js/Go/java带注释

为了更好的阅读体检&#xff0c;为了更好的阅读体检&#xff0c;&#xff0c;可以查看我的算法学习博客第二题-限行 在线评测链接:P1267 题目内容 塔子哥是一个富有的商人&#xff0c;他在一家大型贸易公司工作。他的公司位于城市的中心区&#xff0c;是一座高耸的摩天大楼。…