opencv#34 边缘检测(二)

Laplacian(拉普拉斯)算子

前面介绍的Sobel算子和Scharr算子存在的问题:

1.要分别计算两个方向(x,y)的边缘,之后将两方向的边缘进行叠加。

2.边缘与方向相关性较大。当我们通过Sobel算子提取x方向检测时,它所能够检测到的边缘都是一个沿着y轴方向的边缘,与检测的方向相反(垂直方向),当进行y方向检测时,得到的边缘是一个水平方向的,垂直的边缘没有办法提取,这就造成了在选择边缘检测的时候需要额外主义边缘的方向性,同时可能出现倾斜的边缘会被反复的检测出来(x方向,y方向检测都有),二当两者边缘检测结果进行叠加时,则会将倾斜的边缘额外加强。

     因此拉普拉斯算子针对图像边缘的方向性提出一种无边缘的算法。拉普拉斯算子分别对两个方向进行求导然后进行叠加,也就是只要我们使用了拉普拉斯算子,就可以直接提取图像中各个方向的边缘,而无需分别提取x方向和y方向后在进行叠加。所以拉普拉斯算子具有无关方向性的优点,但是由于拉普拉斯算子需要进行两次求导,所以更容易受噪声的影响

 

由上图拉普拉斯算子矩阵我们可以看出它是一个中心对称的边缘检测算子,因此对于各个方向都可以检测出来。

Laplacian边缘检测函数 

Laplacian()

void cv::Laplacian(InputArray    src,OutputArray   dst,int           ddepth,int           ksize = 1,double        scale = 1,double        delta = 0,int           borderType = BORDER_DEFAULT)

·src:输入原图像,可以是灰度图像和彩色图像。

·dst:输出图像,与输入图像src具有相同的尺寸和通道数。

·ddepth:输出图像的数据类型(深度),根据输入图像的数据类型不同拥有不同的取值范围。进行边缘检测时,可能会出现数值较大,较小,负数的情况。

·ksize:滤波器的大小,必须为正奇数,参数默认值为1,表示的时一个3*3尺寸的拉普拉斯边缘检测算子。

·scale:对导数计算结果进行缩放的缩放因子,默认系数为1,不进行缩放。

·delta:偏值,在计算结果中加上偏值。

·borderType:像素外推法标志。

Canny边缘检测原理介绍

     Canny边缘检测是对Sobel算法进行优化的算法,Sobel算子进行边缘检测时得到的边缘信息非常多,而且有些边缘信息较亮,而有些边缘信息较暗,有些边缘信息时存在图像内部,可能是由于光照等因素影响,使得某一个局部区域像素值发生了微小波动,但是通过Sobel算子依然能够将这个波动检测出来,然而此波动却不是真正的边缘,因此Canny算法的思想就是如何去除掉虚假边缘。

Canny边缘检测的主要步骤:

Step1:使用高斯滤波平滑图像,目的是尽可能减少出现在图像内部的虚假边缘,常用的高斯滤波平滑图像的滤波器如下图矩阵。

Step2:计算图像中每个像素的梯度方向和幅值。

Step3:应用非极大值抑制算法消除边缘检测带来的杂散响应。

Step4:应用双阀值法划分强边缘和弱边缘,给出较低和较高的阈值,在较低阈值之下的梯度响应舍弃,当梯度的赋值大于较高阈值时,称强边缘,当梯度幅值在阈值之间时,称弱边缘。

Step5:消除孤立的弱边缘,孤立弱边缘指周围没有强边缘的存在,若存在强边缘,那么将弱边缘转化为强边缘。

Canny算法函数 

Canny()

void cv::Canny(InputArray    image,OutputArray   edges,double        threshold1,double        threshold2,int           apertureSize = 3,bool          L2gradient = false)

·image:输入图像,必须是CV_8U单通道或者三通道的图像。

·edges:输出图像,与输入图像具有相同尺寸的单通道图像,且数据类型为CV_8U,输出图像进行了二值化处理的结果,显示边缘的区域全为最高值255,不是边缘的区域全为0。

·threshold1:第一个滞后阈值。

·threshold2:第二个滞后阈值。

·apertureSize:Sobel算子的直径,参数默认值为3。

·L2gradient:计算图像梯度赋值的标志,使用默认值即可。

示例
#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv; //opencv的命名空间
using namespace std;//主函数
int main()
{//读取图像,黑白图像边缘检测结果较为明显Mat img = imread("E:/opencv/opencv-4.6.0-vc14_vc15/opencv/lenaGray.png");if (img.empty()){cout << "请确认图像文件名称是否正确" << endl;return -1;}Mat result, result_g, result_G;//未滤波提取边缘Laplacian(img, result, CV_16S, 3, 1, 0);convertScaleAbs(result, result); //取绝对值函数//滤波后提取Laplacian边缘GaussianBlur(img, result_g, Size(3, 3), 5, 0); //高斯滤波Laplacian(result_g, result_G, CV_16S, 3, 1, 0);convertScaleAbs(result_G, result_G); //取绝对值函数//显示图像imshow("result", result);imshow("result_G", result_G);cout << "接下来进行Canny比爱能源检测" << endl;waitKey(0);//等待函数用于显示图像,按下键盘任意键后退出Mat resultHigh, resultLow, resultG;//大阈值检测图像边缘Canny(img, resultHigh, 100, 200, 3);//弱阈值和强阈值较大//小阈值检测图像边缘Canny(img, resultLow, 20, 40, 3);//弱阈值和强阈值较小//高斯模糊后检测图像边缘GaussianBlur(img, resultG, Size(3, 3), 5);Canny(resultG, resultG, 100, 200, 3);//显示图像imshow("resultHigh", resultHigh);imshow("resultLow", resultLow);imshow("resultG", resultG);waitKey(0);//等待函数用于显示图像,按下键盘任意键后退出return 0;}
结果

拉普拉斯边缘检测结果:

 可以看到图像中即提取到了竖直边缘,也提取到了水平边缘,得到的结果中边缘与方向无关,若图像中含有较大的噪声,检测后的图像内部也会出现一些弱小的边缘,这些边缘无法形成条状或带状区域,是一个零散雪花状的区域。

进行高斯滤波后的结果,明显减少了虚假边缘,整个图像结果较为清晰,边缘轮廓也比较准确。

 

 Canny算法得到的结果中,使用较低阈值得到的结果边缘比较多,而使用较高阈值得到的边缘就较少,少了很多虚假边缘。

 

经过高斯滤波后的检测结果,一些虚假的边缘被去除,同时边缘整体信息还是完整保留,虽然Canny算法有一定的优越性,但是我们也要根据实际的情况对图像进行预处理,之后再使用相应的算法得到我们想要的结果。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM工作原理与实战(二十一):内存管理

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、不同语言的内存管理 1.C/C的内存管理 2.Java的内存管理 二、垃圾回收的对比 1.自动垃圾回收与手动垃圾回收的对比 2.优点与缺点 总结 前言 JVM作为Java程序的运行环境&#…

Spring Boot 3.2.2整合MyBatis-Plus 3.5.5依赖不兼容问题

问题演示 导依赖 当你启动项目就会 抛出该异常 java.lang.IllegalArgumentException: Invalid value type for attribute factoryBeanObjectType: java.lang.String 问题原因 mybatis-plus 中 mybatis 的整合包版本不够导致的 解决方案 排除掉mybatis-plus 中 mybatis 的整合…

51-15 视频理解串讲—TimeSformer论文精读

今天读的论文题目是Is Space-Time Attention All You Need for Video Understanding? Facebook AI提出了一种称为TimeSformer视频理解的新架构&#xff0c;这个架构完全基于transformer&#xff0c;不使用卷积层。它通过分别对视频的时间和空间维度应用自注意力机制&#xff…

【Flink-1.17-教程】-【四】Flink DataStream API(1)源算子(Source)

【Flink-1.17-教程】-【四】Flink DataStream API&#xff08;1&#xff09;源算子&#xff08;Source&#xff09; 1&#xff09;执行环境&#xff08;Execution Environment&#xff09;1.1.创建执行环境1.2.执行模式&#xff08;Execution Mode&#xff09;1.3.触发程序执行…

智能家居20年,从「动手」到「用脑」

【潮汐商业评论/原创】 正在装修新家的Carro最近陷入了纠结之中&#xff0c;“还没想好要怎么装一套完整的智能家居&#xff0c;家里的基装就已经开始了。” 事实上&#xff0c;Carro对智能家居也不了解&#xff0c;并不知道该如何下手&#xff0c;心想“要是能一次性设计好就…

Mysql复习1--理论基础+操作实践--更新中

Mysql 索引索引的分类索引失效sql优化 删除数据库数据恢复 索引InnoDB引擎MyISAM引擎Memory引擎Btree索引支持支持支持hash索引不支持不支持支持R-tree索引不支持支持不支持Full-text索引5.6版本以后支持支持不支持 索引 解释说明: 索引指的是帮助mysql高效的获取数据的结构叫…

list下

文章目录 注意&#xff1a;const迭代器怎么写&#xff1f;运用场合&#xff1f; inserterase析构函数赋值和拷贝构造区别&#xff1f;拷贝构造不能写那个swap,为什么&#xff1f;拷贝构造代码 面试问题什么是迭代器失效&#xff1f;vector、list的区别&#xff1f; 完整代码 注…

4 课程分类查询

4 课程分类查询 4.1 需求分析 下边根据内容管理模块的业务流程&#xff0c;下一步要实现新增课程&#xff0c;在新增课程界面&#xff0c;有三处信息需要选择&#xff0c;如下图&#xff1a; 课程等级、课程类型来源于数据字典表&#xff0c;此部分的信息前端已从系统管理服…

【jetson笔记】vscode远程调试

vscode安装插件 vscode安装远程插件Remote-SSH 安装完毕点击左侧远程资源管理器 打开SSH配置文件 添加如下内容&#xff0c;Hostname为jetson IP&#xff0c;User为登录用户名需替换为自己的 Host aliasHostName 192.168.219.57User jetson配置好点击连接&#xff0c;控制台输…

66.Spring是如何整合MyBatis将Mapper接口注册为Bean的原理?

原理 首先MyBatis的Mapper接口核心是JDK动态代理 Spring会排除接口&#xff0c;无法注册到IOC容器中 MyBatis 实现了BeanDefinitionRegistryPostProcessor 可以动态注册BeanDefinition 需要自定义扫描器&#xff08;继承Spring内部扫描器ClassPathBeanDefinitionScanner ) 重…

【计算机网络】UDP协议与TCP协议

文章目录 一、端口号1.什么是端口号2.端口号范围划分3.认识知名端口号(Well-Know Port Number)4.netstat5.pidof 二、UDP协议1.UDP协议端格式2.UDP的特点3.面向数据报4.UDP的缓冲区5.UDP使用注意事项6.基于UDP的应用层协议 三、TCP协议1.TCP协议段格式1.1理解封装解包和分用1.2…

【数学建模】插值与拟合

文章目录 插值插值方法用Python解决插值问题 拟合最小二乘拟合数据拟合的Python实现 适用情况 处理由试验、测量得到的大量数据或一些过于复杂而不便于计算的函数表达式时&#xff0c;构造一个简单函数作为要考察数据或复杂函数的近似 定义 给定一组数据&#xff0c;需要确定满…

伸向Markdown的黑手,知名博客平台曝出LFI漏洞

如果你至今依然在坚持写博客&#xff0c;在知乎或其他自媒体平台上发表文章&#xff0c;那你应该对Markdown很熟悉了。这是一种轻量级标记语言&#xff0c;借此可以用纯文本格式编写文档&#xff0c;并用简单的标记设置文档格式&#xff0c;随后即可轻松转换为具备精美排版的内…

安装宝塔面板后k8s所在节点pod无法正常工作解决方法,kubernetes k8s 与宝塔面板冲突解决方法

在实际项目过程中我们使用了k8s 在生产环境中运行管理服务。 但是对服务器的状态管理我们使用了宝塔面板进行 K8s 版本1.2.8 宝塔面板 版本 8.05 操作步骤是这样的。 1.完成1.2.8 k8s的节点安装&#xff0c;并正常运行服务。 过程略 2.安装宝塔面板 ​ yum install -y …

vue中图片不显示问题 - vue中静态资源加载

文章目录 vue中图片不显示问题静态资源URL 转换规则webpack 静态资源处理 图片不显示问题问题描述解决办法1&#xff1a;使用require引入require is not defined 解决办法2&#xff1a;使用import引入解决办法3&#xff1a;将图片放进公共文件夹static或public vue中图片不显示…

PHP中一些特征函数导致的漏洞总结

第一部分&#xff1a; 特征函数 接触到几个常用的函数&#xff1a; \\ \\\ md5 intval strpos in_array preg_match str_replacephp用这些函数实现过滤一些代码&#xff0c;漏洞可能有一些特性&#xff0c;利用这些特征代码进行对比&#xff1b;账号密码对比&#xff1b;强制检…

ChatGPT无法胜任的五种编程任务

我喜欢把ChatGPT看作是StackOverflow的智能版&#xff0c;它大有帮助&#xff0c;但短期内不会取代专业人士。作为一名前数据科学家&#xff0c;ChatGPT问世后&#xff0c;我花了大量时间来试用它。其编程能力确实给我留下了深刻的印象。它可以从零开始生成非常有用的代码&…

核桃的数量---蓝桥杯

思路&#xff1a; 题目所代表的意思就是a,b,c这三个必须是核桃数量的因子&#xff0c;即a,b,c三个的最小公倍数 #include <iostream> #include <algorithm> using namespace std; // int main() { int a,b,c;cin>>a>>b>>c;int da*b/__gcd(a,b…

大数据处理,Pandas与SQL高效读写大型数据集

大家好&#xff0c;使用Pandas和SQL高效地从数据库中读取、处理和写入大型数据集&#xff0c;以实现最佳性能和内存管理&#xff0c;这是十分重要的。 处理大型数据集往往是一项挑战&#xff0c;特别是在涉及到从数据库读取和写入数据时。将整个数据集加载到内存中的传统方法可…

antdesignvue中使用VNode写法

1、使用场景 如图&#xff1a;消息提示框中&#xff0c;将数据中的数据单独一行显示 2、代码 let errorList res.result; //后端返回的数据例&#xff1a; ["1. 数据格式不正确","2. 数据已存在"]if(errorList&&errorList.length!0){this.$notif…