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.mzph.cn/news/645181.shtml

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

相关文章

差分进化算法求解基于移动边缘计算 (MEC) 的无线区块链网络的联合挖矿决策和资源分配(提供MATLAB代码)

一、优化模型介绍 在所研究的区块链网络中&#xff0c;优化的变量为&#xff1a;挖矿决策&#xff08;即 m&#xff09;和资源分配&#xff08;即 p 和 f&#xff09;&#xff0c;目标函数是使所有矿工的总利润最大化。问题可以表述为&#xff1a; max ⁡ m , p , f F miner …

gin中使用限流中间件

限流又称为流量控制&#xff08;流控&#xff09;&#xff0c;通常是指限制到达系统的并发请求数&#xff0c;本文列举了常见的限流策略&#xff0c;并以gin框架为例演示了如何为项目添加限流组件。 限流 限流又称为流量控制&#xff08;流控&#xff09;&#xff0c;通常是指…

如何在美国硅谷高防服务器上运行自定义的脚本和应用程序

在美国硅谷高防服务器上运行自定义的脚本和应用程序需要一定的技术和知识。下面我们将介绍一些关键步骤&#xff0c;帮助您顺利地在这些服务器上运行自定义应用程序和脚本。 确保您有对服务器的访问权限&#xff0c;并且已经通过SSH等方式连接到服务器。接下来&#xff0c;您可…

不就业,纯兴趣,应该自学C#还是JAVA?

不就业&#xff0c;纯兴趣&#xff0c;应该自学C#还是JAVA? 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「JAVA的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff…

微信小程序(十四)分包和分包预加载

注释很详细&#xff0c;直接上代码 新增内容&#xff1a; 1.分包的配置 2.分包预加载的写法 先说说为什么需要分包&#xff1a; 小程序追求小而快&#xff0c;主包的大小控制是小程序上线的硬性要求&#xff0c;分包有利于小程序优化加载速度 分包的注意事项&#xff1a; 单个分…

网络原理-初识(1)

目录 网络发展史 独立模式 网络互连 局域网LAN 广域网WAN 网络通信基础 IP地址 概念 格式 端口 概念 格式 认识协议 概念 作用 五元组 网络发展史 独立模式 独立模式:计算机之间相互独立; 网络互连 随着时代的发展,越来越需要计算机之间相互通信,共享软件和数…

【AI的未来 - AI Agent系列】【MetaGPT】6. 用ActionNode重写技术文档助手

文章目录 0. 前置推荐阅读1. 重写WriteDirectory Action1.1 实现WriteDirectory的ActionNode&#xff1a;DIRECTORY_WRITE1.2 将 DIRECTORY_WRITE 包进 WriteDirectory中 2. 重写WriteContent Action2.1 思考重写方案2.2 实现WriteContent的ActionNode2.3 改写WriteContent Act…

UV紫外激光打标机的优缺点是什么

​ UV紫外激光打标机具有以下优点&#xff1a; 1. 精度高&#xff1a;紫外激光打标机的光束质量好&#xff0c;聚焦光斑小&#xff0c;可以实现在各种材料上进行超精细打标。 2. 速度快&#xff1a;由于紫外激光的独特特性&#xff0c;打标速度非常快&#xff0c;提高了生产效…

冷链温湿度监控解决方案,实时监测,助力运输安全

为了确保药品、生鲜等在冷链运输过程中的安全监管,需要对冷链、仓库等环节的温湿度信息进行实时自动检测和记录&#xff0c;有效防范储运过程中可能影响产品质量安全的各类风险&#xff0c;确保储存和运输过程的产品质量。 冷链温湿度监控系统解决方案&#xff0c;利用智能温湿…

【目标跟踪】多相机环视跟踪

文章目录 一、前言二、流程图三、实现原理3.1、初始化3.2、输入3.3、初始航迹3.4、航迹预测3.5、航迹匹配3.6、输出结果 四、c 代码五、总结 一、前言 多相机目标跟踪主要是为了实现 360 度跟踪。单相机检测存在左右后的盲区视野。在智能驾驶领域&#xff0c;要想靠相机实现无…

springboot120企业级工位管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的企业级工位管理系统 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 …

SpringMVC 注解配置SpringMVC

文章目录 1、创建初始化类&#xff0c;代替web.xml2、创建SpringConfig配置类&#xff0c;代替spring的配置文件3、创建WebConfig配置类&#xff0c;代替SpringMVC的配置文件4、测试功能 使用配置类和注解代替web.xml和SpringMVC配置文件的功能 1、创建初始化类&#xff0c;代替…

Vue3实战:显示后台获取的用户数据

文章目录 一、实战概述二、实战步骤&#xff08;一&#xff09;创建数据库与表&#xff08;二&#xff09;编写后端程序1、创建Spring Boot项目2、配置数据源3、创建用户实体类4、创建用户仓库接口5、创建用户服务类6、创建用户控制器7、启动应用&#xff0c;查看结果 &#xf…

蓝牙BLE基础知识

目录 一、初识蓝牙BLE 1.课程介绍 2.为什么需要蓝牙技术 3.蓝牙发展历史 4.蓝牙技术优势 5.蓝牙技术简介 6.学习补充 二、物理层&#xff08;Physical layer&#xff09; 1.模拟调制 2.数字调制 3.射频信道 4.学习补充 三、链路层&#xff08;link layer&#xff0…

Jmeter 设置全局请求 重点cook

原因 在使用jmeter 过程中为了方便 &#xff0c;会设置很多公众信心 比如请求头 请求cook 还会设置多个线程组 在同一个线程组中 我们只需要设置一个请求请求cook 就可以了 但是 有逆骨 就是喜欢多个线程组所以出现问题了 解决方案 设置一个全局变量 步骤 在测试计划中设…

图形用户界面(GUI)开发教程

文章目录 写在前面MATLAB GUI启动方式按钮&#xff08;Push Button&#xff09;查看属性tag的命名方式回调函数小小的总结 下拉菜单&#xff08;Pop-up Menu&#xff09;单选框&#xff08;Radio Button&#xff09;和复选框&#xff08;Check Box&#xff09;静态文本&#xf…

12.前端--CSS-背景属性

1.背景颜色 样式名称&#xff1a; background-color 定义元素的背景颜色 使用方式: background-color:颜色值; 其他说明&#xff1a; 元素背景颜色默认值是 transparent&#xff08;透明&#xff09;      background-color:transparent; 代码演示&#xff1a; 背景色…

硬件基础:组合逻辑电路

什么是组合逻辑电路 组合逻辑电路是由一些基本的逻辑门电路组成的&#xff0c;没有反馈&#xff0c;输出仅取决于输入。 组合逻辑电路是数字逻辑电路中一种重要的电路类型&#xff0c;它是由多个逻辑门&#xff08;例如与门、或门、非门等&#xff09;组成的电路。组合逻辑电路…

APUE学习之信号(Signal)

目录 一、信号 1、基本概念 2、用户处理信号的方式 3、查看信号 4、可靠信号和不可靠信号 5、信号种类 6、终止进程信号的区别 二、进程对信号的处理 1、signal&#xff08;&#xff09;函数 2、sigaction&#xff08;&#xff09;函数 3、代码演示 4、运行结果…

k8s---HPA 命名空间资源限制

目录 HPA相关知识 HPA&#xff08;Horizontal Pod Autoscaling&#xff09;Pod 水平自动伸缩&#xff0c;Kubernetes 有一个 HPA 的资源&#xff0c;HPA 可以根据 CPU 利用率自动伸缩一个 Replication Controller、 Deployment 或者Replica Set 中的 Pod 数量。 &#xff08;1…