8.3Sobel算子边缘检测

news2024/11/17 3:05:51

实验原理

Sobel算子是一种广泛使用的一阶导数边缘检测算子,它通过计算图像在水平和垂直方向上的梯度来检测边缘。Sobel算子使用一对3x3的掩模来实现这一功能。相比于其他边缘检测算子,Sobel算子在检测边缘的同时还能提供一定的抗噪能力。

在OpenCV中,Sobel算子是一种常用的边缘检测技术,它通过计算图像灰度值的一阶导数来突出图像中的边缘。Sobel算子能够检测水平和垂直方向上的边缘,并且具有一定的噪声抑制能力。

在OpenCV中,Sobel函数用于计算图像的一阶或二阶导数,通常用于边缘检测。Sobel函数通过对图像应用特定的卷积核来估计图像局部区域的梯度,从而帮助识别图像中的边缘。

Sobel算子的基本原理

Sobel算子使用两个3x3的核来分别计算水平和垂直方向上的梯度。这两个核如下所示:

通过这两个核分别对图像进行卷积操作,可以获得图像在水平和垂直方向上的梯度。通常还会计算梯度的大小(幅度)和方向(角度)。

函数原型

void Sobel(InputArray src, OutputArray dst, int ddepth, int dx, int dy, 
           int ksize=3, double scale=1, double delta=0, int borderType=BORDER_DEFAULT);
参数说明
src: 输入图像。可以是单通道或多通道图像。如果是多通道图像,每个通道都将独立处理。
dst: 输出图像。它将具有与输入图像相同的尺寸,但深度取决于ddepth参数。
ddepth: 输出图像的深度。常见的选择有:
CV_16S: 16位有符号整数。
CV_32F: 32位浮点数。
CV_64F: 64位浮点数。
-1: 保持输入图像的深度不变。
dx: 在x方向上的导数阶数(0表示不求导,1表示一阶导数,2表示二阶导数)。
dy: 在y方向上的导数阶数(同dx)。
ksize: Sobel核的大小,默认为3。可以是1、3、5或7。较大的核可以提供更好的抗噪性能。
scale: 可选的缩放因子。默认为1,即不缩放。
delta: 可选的常数值,将在卷积操作后加到每个像素上。
borderType: 边界处理类型。当卷积核覆盖图像边界时,需要指定如何处理边界外的数据。常见的边界处理方式有:
BORDER_CONSTANT: 使用常数值填充边界外区域。
BORDER_REPLICATE: 复制边界像素。
BORDER_REFLECT: 镜像反射边界。
BORDER_WRAP: 边界环绕(类似于纹理坐标)。
BORDER_REFLECT_101 或 BORDER_DEFAULT: 默认的边界反射方式。

示例代码1

使用OpenCV中的Sobel函数步骤
在OpenCV中,可以直接使用Sobel函数来计算图像的梯度。下面是一个基于C++的示例程序,展示如何使用Sobel算子进行边缘检测。

步骤一:包含必要的头文件

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;

步骤二:加载图像
int main(int argc, char** argv)
{
    Mat src = imread("path_to_your_image.jpg", IMREAD_GRAYSCALE);
    if (src.empty())
    {
       cout << "Error: Image cannot be loaded!" << endl;
        return -1;
    }

步骤三:定义输出图像
    Mat grad_x, grad_y;
    Mat abs_grad_x, abs_grad_y;

步骤四:应用Sobel算子
    // 计算水平梯度
    Sobel(src, grad_x, CV_16S, 1, 0);
    // 计算垂直梯度
    Sobel(src, grad_y, CV_16S, 0, 1);

    // 转换为绝对值
    convertScaleAbs(grad_x, abs_grad_x);
    convertScaleAbs(grad_y, abs_grad_y);
这里CV_16S指定了输出图像的深度为16位有符号整数。
Sobel函数的第一个参数是输入图像,
第二个参数是输出图像,
第三个参数指定了输出图像的深度,
第四个和第五个参数分别指定在X轴和Y轴方向上的导数阶数。

步骤五:组合梯度
    // 合并梯度结果
    Mat grad;
    addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad);

这里使用addWeighted函数将水平和垂直梯度合并成一个图像。你可以根据需要调整权重。

步骤六:显示结果
    namedWindow("Original Image", WINDOW_AUTOSIZE);
    imshow("Original Image", src);

    namedWindow("Horizontal Gradient", WINDOW_AUTOSIZE);
    imshow("Horizontal Gradient", abs_grad_x);

    namedWindow("Vertical Gradient", WINDOW_AUTOSIZE);
    imshow("Vertical Gradient", abs_grad_y);

    namedWindow("Combined Gradient", WINDOW_AUTOSIZE);
    imshow("Combined Gradient", grad);

    waitKey(0);
    return 0;
}
这个程序将显示原始图像、水平梯度、垂直梯度以及合并后的梯度图像。


注意事项
数据类型: Sobel操作可能导致结果溢出,因此通常输出图像的深度设置为CV_16S。在显示之前,使用convertScaleAbs函数将结果转换为CV_8U类型。
边界处理: Sobel算子在处理边界像素时可能会出现问题,因此需要选择合适的边界处理方式。
噪声: Sobel算子虽然有一定的抗噪能力,但在高噪声环境中可能会产生虚假边缘。可以考虑先对图像进行平滑处理,如使用GaussianBlur函数减少噪声的影响。

总结
使用OpenCV的Sobel函数可以方便地实现边缘检测。通过计算水平和垂直方向上的梯度,并将它们合并,可以得到一幅清晰的边缘图像。这种方法在图像处理和计算机视觉中有广泛的应用,尤其是在特征提取和目标识别等领域。

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;


int main(int argc, char** argv)
{
    Mat src = imread("path_to_your_image.jpg", IMREAD_GRAYSCALE);
    if (src.empty())
    {
       cout << "Error: Image cannot be loaded!" << endl;
        return -1;
    }


    Mat grad_x, grad_y;
    Mat abs_grad_x, abs_grad_y;


    // 计算水平梯度
    Sobel(src, grad_x, CV_16S, 1, 0);
    // 计算垂直梯度
    Sobel(src, grad_y, CV_16S, 0, 1);

    // 转换为绝对值
    convertScaleAbs(grad_x, abs_grad_x);
    convertScaleAbs(grad_y, abs_grad_y);


    // 合并梯度结果
    Mat grad;
    addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad);


    namedWindow("Original Image", WINDOW_AUTOSIZE);
    imshow("Original Image", src);

    namedWindow("Horizontal Gradient", WINDOW_AUTOSIZE);
    imshow("Horizontal Gradient", abs_grad_x);

    namedWindow("Vertical Gradient", WINDOW_AUTOSIZE);
    imshow("Vertical Gradient", abs_grad_y);

    namedWindow("Combined Gradient", WINDOW_AUTOSIZE);
    imshow("Combined Gradient", grad);

    waitKey(0);
    return 0;
}

这个程序将显示原始图像、水平梯度、垂直梯度以及合并后的梯度图像。

总结
使用OpenCV的Sobel函数可以方便地实现边缘检测。通过计算水平和垂直方向上的梯度,并将它们合并,可以得到一幅清晰的边缘图像。这种方法在图像处理和计算机视觉中有广泛的应用,尤其是在特征提取和目标识别等领域。

运行结果1

实验代码2

 

#include "pch.h"
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
//#pragma comment(lib,"opencv_world450d.lib")

 int main()
{
	//读取图像,黑白图像边缘检测结果较为明显
	Mat img = imread("03.png", IMREAD_ANYCOLOR);
	if (img.empty())
	{
		cout << "请确认图像文件名称是否正确" << endl;
		return -1;
	}
	Mat resultX, resultY, resultXY;
	Sobel(img, resultX, CV_16S, 2, 0, 1);//X方向一阶边缘
	convertScaleAbs(resultX, resultX);
	Sobel(img, resultY, CV_16S, 0, 1, 3);//Y方向一阶边缘
	convertScaleAbs(resultY, resultY);
	resultXY = resultX + resultY;//整幅图像的一阶边缘
	//显示图像
	namedWindow("resultX", WINDOW_NORMAL);
	imshow("resultX", resultX);
	namedWindow("resultY", WINDOW_NORMAL);
	imshow("resultY", resultY);
	namedWindow("resultXY", WINDOW_NORMAL);
	imshow("resultXY", resultXY);
	waitKey(0);
	return 0;
 }

运行结果2

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

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

相关文章

【射频通信电子线路基础第四讲】LC匹配网络、史密斯圆图、噪声与噪声系数

一、LC匹配网络 1、L-I型&#xff08;负载与电抗并联&#xff09; 2、L-II型&#xff08;负载与电抗串联&#xff09; 3、T型网络和π型网络例子 二、Smith圆图 这里先附上知乎大神的讲解链接&#xff0c;推荐直接去看非常适合入门理解&#xff0c;看完之后茅塞顿开 https://…

MySQL 安全机制全面解析

‍ 在如今的数字化时代&#xff0c;数据库安全 变得越来越重要。为了防止对数据库进行非法操作&#xff0c;MySQL 定义了一套完整的安全机制&#xff0c;包括用户管理、权限管理 和 角色管理。本文将为你深入浅出地介绍这三大安全机制&#xff0c;帮助你轻松掌握MySQL的安全管…

MPP数据库之SelectDB

SelectDB 是一个高性能、云原生的 MPP&#xff08;大规模并行处理&#xff09;数据库&#xff0c;旨在为分析型数据处理场景提供快速、弹性和高效的解决方案。它专为处理大规模结构化和半结构化数据设计&#xff0c;常用于企业级业务分析、实时分析和决策支持。 SelectDB 是在…

Vue2时间轴组件(TimeLine/分页、自动顺序播放、暂停、换肤功能、时间选择,鼠标快速滑动)

目录 1介绍背景 2实现原理 3组件介绍 4代码 5其他说明 1介绍背景 项目背景是 一天的时间轴 10分钟为一间隔 一天被划分成144个节点 一页面12个节点 代码介绍的很详细 可参考或者借鉴 2实现原理 对Element-plus滑块组件的二次封装 基于Vue2&#xff08;2.6.14&#x…

数字孪生引领智慧医院革新:未来医疗的智能化之路

数字孪生&#xff08;Digital Twin&#xff09; 是指将物理实体或系统的数字化模型与其实时运行数据相结合&#xff0c;以反映实体的状态、行为和性能&#xff0c;并通过数据分析和仿真来优化决策和管理。在智慧医院建设中&#xff0c;数字孪生技术扮演着关键角色。 1. 数字孪生…

基于SpringBoot+Vue的瑜伽体验课预约管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

国内按月/季/年使用GPT4.0及OpenAI最新的模型

其实gpt官方版本不仅对于网络要求很高&#xff0c;且订阅用户对高级模型的使用也是有次数限制的&#xff0c; 国内想要稳定且最快同步官网的最新模型&#xff0c;我推荐一个地址,可以方便的不限次数的使用GPT4.0等模型&#xff0c; 今天早上刚出的OpenAI全新的草莓模型&#xf…

uniapp 发布苹果IOS详细流程,包括苹果开发者公司账号申请、IOS证书、.p12证书文件等

记录一下uniapp发布苹果IOS的流程。 一、苹果开发者公司账号申请 1、邓白氏编码申请&#xff08;先申请公司邓白氏编码&#xff0c;这一步需要1-2周&#xff0c;没有这个编码苹果开发者没法申请&#xff0c;已有编码的跳过此步骤&#xff09;&#xff1a; 1&#xff09;联系苹…

【C++ Primer Plus习题】16.1

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include <string> usin…

Linux通配符*、man 、cp、mv、echo、cat、more、less、head、tail、等指令、管道 | 、指令的本质 等的介绍

文章目录 前言一、Linux通配符*二、man 指令三、 cp 指令四、mv指令五、 echo 指令六、cat 指令七、more 指令八、 less 指令九、 head 指令十、 tail指令十一、 管道 |十二、指令的本质总结 前言 Linux通配符*、man 、cp、mv、echo、cat、more、less、head、tail、等指令、管…

[Unity Demo]重启项目之从零开始制作空洞骑士Hollow Knight第一集:导入素材以及建立并远程连接git仓库

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、导入素材二、使用步骤 1.建立并远程连接git2.github和仓库连接总结 前言 好久没来CSDN看看&#xff0c;突然看到前两年自己写的文章从零开始制作空洞骑士只…

【计算机网络 - 基础问题】每日 3 题(一)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

基于云计算的虚拟电厂负荷预测

基于云计算的虚拟电厂负荷预测 随着电网规模的扩大及新能源的不断应用&#xff0c;并网电网的安全性和经济性备受关注。 电网调度不再是单一或局部控制&#xff0c;而是采用智能网络集成方式调度 。 智能电网应具有以下特点&#xff1a;坚强自愈&#xff0c;可以抵御外来干扰甚…

使用 Milvus、vLLM 和 Llama 3.1 搭建 RAG 应用

vLLM 是一个简单易用的 LLM 推理服务库。加州大学伯克利分校于 2024 年 7 月将 vLLM 作为孵化项目正式捐赠给 LF AI & Data Foundation 基金会。欢迎 vLLM 加入 LF AI & Data 大家庭&#xff01;&#x1f389; 在主流的 AI 应用架构中&#xff0c;大语言模型&#xff0…

【devops】devops-git之介绍以及日常使用

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

【GBase 8c V5_3.0.0 分布式数据库常用几个SQL】

1.检查应用连接数 以管理员用户 gbase&#xff0c;登录数据库主节点。 接数据库&#xff0c;并执行如下 SQL 语句查看连接数。 SELECT count(*) FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;2.查看空闲连接 查看空闲(state 字段为”idle”)且长时间没有更…

【linux-Day3】linux下的基本指令

【linux-Day3】linux下的基本指令 linux下的基本指令&#x1f4e2;man&#xff1a;访问linux手册页&#x1f4e2;echo&#xff1a;把字符串写入指定文件中&#x1f4e2;cat&#xff1a;查看目标文件的内容&#x1f4e2;cp&#xff1a;复制文件或目录&#x1f4e2;mv&#xff1a…

【【通信协议ARP的verilog实现】】

【【通信协议ARP的verilog实现】】 eth_arp_test.v module eth_arp_test(input sys_clk , //系统时钟input sys_rst_n , //系统复位信号&#xff0c;低电平有效input touch_key , //触摸按键,用于触发开发…

【JVM】判断对象能否回收的两种方法:引用计数算法,可达性分析算法

1、引用计数算法&#xff1a; 给对象添加一个引用计数器&#xff0c;当该对象被其它对象引用时计数加一&#xff0c;引用失效时计数减一&#xff0c;计数为0时&#xff0c;可以回收。 特点&#xff1a;占用了一些额外的内存空间来进行计数&#xff0c;原理简单&#xff0c;判…

wincc利用拓展屏实现多台显示器显示单个项目配置方法详解

以下视频为完整操作教程 wincc利用拓展屏实现多台显示器显示单个项目配置方法详解 一、硬件接线 首先要保证wincc项目主机电脑要具备两个显示器接口&#xff0c;不管是VGA还是HDMI的都可以&#xff0c;让后将两台显示器接到同一台电脑上。如下图&#xff1a; 二、windows设置 …