opencv#34 边缘检测(二)

news2024/9/23 17:23:00

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.coloradmin.cn/o/1409272.html

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

相关文章

如何在转接的NVME 固态盘上安装WIN 系统并引导启动

问题&#xff1a; 家里的台式机一直挂着一块128G的SSD固态盘&#xff0c;由于家里自己建了NAS存储&#xff0c;所以基本数据都在NAS里&#xff0c;台式机就没有挂机械盘了&#xff0c;但是最近台式机空间被系统侵蚀&#xff0c;显然就不够用了&#xff0c;除了清理系统&#xf…

八数码(BFS + 队列 + 哈希表)

这题虽然比较难&#xff0c;但仍然遵循BFS的思路图片引自我的上一篇文章&#xff1a; 走迷宫&#xff08;BFS 队列&#xff09;-CSDN博客 难点 &#xff08;1&#xff09;如何将一个二维数组表示的状态记录下来&#xff0c;并且需要便于知道某个状态是否访问过 &#xff0…

Biotin-PEG4-TSA,生物素-PEG4-酪胺,用于标记蛋白质、核酸等生物分子

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;Biotin-PEG4-Tyramide&#xff0c;Biotin-PEG4-TSA&#xff0c;生物素-PEG4-酪胺&#xff0c;Biotin PEG4 Tyramide&#xff0c;Biotin PEG4 TSA 一、基本信息 产品简介&#xff1a;Biotin PEG4 Tyramide is compos…

CSS 楼梯弹弹球

<template><view class="loader"></view> </template><script></script><style>body {background-color: #212121;/* 设置背景颜色为 #212121 */}.loader {position: relative;/* 设置定位为相对定位 */width: 120px;/* 设…

杰卡德距离(Jaccard Distance)

杰卡德距离&#xff08;Jaccard Distance&#xff09;&#xff0c;是用于衡量两个集合差异性的一种指标&#xff0c;它是杰卡德相似系数的补集&#xff0c;可以用来区分集合&#xff08;如知识图谱&#xff09;。 杰卡德相似系数 杰卡德相似系数&#xff08;Jaccard similari…

《Linux高性能服务器编程》笔记07

Linux高性能服务器编程 本文是读书笔记&#xff0c;如有侵权&#xff0c;请联系删除。 参考 Linux高性能服务器编程源码: https://github.com/raichen/LinuxServerCodes 豆瓣: Linux高性能服务器编程 文章目录 Linux高性能服务器编程第14章 多线程编程14.1 Linux线程概述14…

【计算机网络】协议,电路交换,分组交换

定义了在两个或多个通信实体之间交换的报文格式和次序,以及报文发送和/或接收一个报文或其他事件所采取的动作.网络边缘: 端系统 (因为处在因特网的边缘) 主机 端系统 客户 client服务器 server今天大部分服务器都属于大型数据中心(data center)接入网(access network) 指将端…

钉钉互动卡片对接-普通互动卡片接入流程

这里写目录标题 一、创建内部应用二、搭建普通卡片模板三、调用互动卡片服务端接口接口报文一、发送卡片二、更新卡片三、获取token 一、创建内部应用 登录开发者后台&#xff0c;创建内部应用。 例如 百度-内部测试获取AppKey和AppSecret&#xff0c; 获取应用访问凭证获取企…

亲测好用!终于找到qq怎么恢复群聊记录的绝佳方法了

在使用QQ进行群聊时&#xff0c;有时我们可能会不小心误删群聊记录&#xff0c;导致无法再查看之前的聊天信息。这时候&#xff0c;许多用户就会思考一个问题&#xff1a;qq怎么恢复群聊&#xff1f;在本文中&#xff0c;我们将深入讨论如何在QQ中恢复群聊记录&#xff0c;并提…

Windows云服务器如何配置多用户登录?(Windows 2012)华为云官方文档与视频地址

Windows云服务器如何配置多用户登录&#xff1f;&#xff08;Windows 2012&#xff09;_弹性云服务器 ECS_故障排除_多用户登录_华为云 打开任务栏左下角的“服务器管理器”&#xff0c;在左侧列表中选中“本地服务器” 然后将右侧“远程桌面”功能的选项修改为“启用”&#x…

浏览器实用:禁止浏览器http自动转成https

前言 因为有些网站支持http和https两种协议访问&#xff0c;有些只支持一种协议访问。但根据动态域名安全策略&#xff08;HSTS&#xff09;&#xff0c;只要该域名在浏览器中访问过一次https&#xff0c;那么浏览器将强制使http的请求变为https。 虽然这条浏览器的策略有利于提…

GPT4科研实践应用与AI绘图技术及论文高效写作

详情点击链接&#xff1a;GPT4科研实践应用与AI绘图技术及论文高效写作 第一&#xff1a;2024年AI领域最新技术 1.OpenAI新模型-GPT-5 2.谷歌新模型-Gemini Ultra 3.Meta新模型-LLama3 4.科大讯飞-星火认知 5.百度-文心一言 6.MoonshotAI-Kimi 7.智谱AI-GLM-4 第二&…

LSTM深度学习网络来预测时间序列的工具箱——支持单时间序列和多元时间序列的预测(基于MATLAB的深度学习工具箱二次开发)

亲爱的参加建模竞赛的同学们&#xff0c;想要在数学建模比赛中脱颖而出吗&#xff1f; 让我们一起探索一款神奇的MATLAB工具箱&#xff0c;带你领略使用深度学习模型来预测时间序列的魅力&#xff01; &#xff08;赶紧分享给数学建模的队友学起来吧&#xff09; &#x1f3…

flask_apscheduler源码分析

前言 遵循flask框架的标准的库&#xff0c;称为flask扩展&#xff0c;flask_apscheduler模块就是一个flask扩展&#xff0c;它使用了flask编程上下文&#xff0c;同时内部完全依赖apscheduler。 我近期使用flask_apscheduler遇到了一个所有job全部死亡的bug。现象&#xff1a;j…

【软件测试】学习笔记-Nginx 在系统架构中的作用

本篇文章你探讨 Nginx 在应用架构中的作用&#xff0c;并从性能测试角度看如何利用 Nginx 数据统计用户访问量。 Nginx 重要的两个概念 代理 首先要来解释一下什么是代理&#xff0c;正向代理和反向代理是什么意思&#xff1f;各自作用是什么&#xff1f;不少同学经常听到这…

重生之我是学神,小小c语言题目可笑可笑

#include<stdio.h> int main(void) { float score[10]{0}; int i 0; for(i0;i<10;i) { printf("请输入%d学生成绩",i1); scanf("%f",&score[i]); } float sum0; int m…

vue+draggable+el-upload上传图片拖拽重排方法

vuedraggableel-upload上传图片拖拽重排方法 1.html <el-row><el-col><el-form-item label"添加视频/图片" prop"device_id"><div class"image-upload"><draggable v-model"fileList" update"dataDr…

CWDM和DWDM的区别

CWDM粗波分复用技术和DWDM密集波分复用技术都是WDM的应用&#xff0c;两者在原理上相似&#xff0c;但是在一些具体特点和应用场景上会有很大的区别&#xff0c;以满足不同应用场景的需求。 一、了解波分复用技术 WDM即波分复用是将一系列载有信息、但波长不同的光信号合成一…

Python学习从0到1 day8 Python循环语句

我相信有些友情不会被时间打败&#xff0c;但我也知道&#xff0c;我们没有办法像从前一样常常相聚&#xff0c;时常联系&#xff0c;所以我想让你知道&#xff0c;我希望你过的很好&#xff0c;像你的照片一样好&#xff0c;我希望你很顺利&#xff0c;像你曾经在我面前憧憬的…

数据结构·单链表

不可否认的是&#xff0c;前几节我们讲解的顺序表存在一下几点问题&#xff1a; 1. 中间、头部的插入和删除&#xff0c;需要移动一整串数据&#xff0c;时间复杂度O(N) 2. 增容需要申请新空间&#xff0c;拷贝数据&#xff0c;释放旧空间。会有不小的消耗 3. 增容一般是2倍的增…