OpenCV——Sobel边缘检测

2023-11-02

一、Sobel算法

1、算法概述

   Sobel边缘检测算法比较简单,实际应用中效率比canny边缘检测效率要高,但是边缘不如Canny检测的准确,然而在很多实际应用的场合,sobel边缘却是首选,Sobel算子是高斯平滑与微分操作的结合体,所以其抗噪声能力很强,用途较多。尤其是在对效率要求较高,而对细纹理不太关系的时候。
   使用Sobel算子提取图像边缘分3个步骤:

  1. 提取X方向的边缘,X方向一阶Sobel边缘检测算法为:
    [ − 1 0 1 − 2 0 2 − 1 0 1 ] (1) \left[ \begin{matrix} -1 & 0 & 1\\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{matrix} \right] \tag{1} 121000121(1)
  2. 提取Y方向的边缘,Y方向一阶Sobel边缘检测算法为:
    [ − 1 − 2 − 1 0 0 0 1 2 1 ] (2) \left[ \begin{matrix} -1 & -2 & -1\\ 0 & 0 & 0 \\ 1 & 2 & 1 \end{matrix} \right] \tag{2} 101202101(2)
  3. 综合两个方向的边缘信息得到整幅图像的边缘。

2、主要函数

Sobel_x_or_y = cv2.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)
  • src:传入的图像
  • ddepth:图像的深度
  • dxdy:指的是求导的阶数,0表示这个方向上没有求导,所填的数一般为0、1、2。
  • ksize:是Sobel算子的大小,即卷积核的大小,必须为奇数1、3、5、7。如果ksize=-1,就演变成为3x3的Scharr算子,scale是缩放导数的比例常数,默认情况为没有伸缩系数。
  • borderType:是判断图像边界的模式,这个参数默认值为cv2.BORDER_DEFAULT。
  • dstdst之后的参数都是可选参数。

二、C++代码

#include <iostream>
#include <opencv2\opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
	//----------------读取图像-----------------
	Mat img = imread("1.jpg");
	//黑白图像边缘检测结果较为明显
	Mat gray_img;
	cvtColor(img, gray_img, COLOR_BGR2GRAY);
	Mat resultX, resultY, resultXY;
	//-------------Sobel边缘检测--------------
	//X方向一阶边缘
	Sobel(img, resultX, CV_16S, 2, 0, 1);
	convertScaleAbs(resultX, resultX);

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

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

	//显示图像
	imshow("resultX", resultX);
	imshow("resultY", resultY);
	imshow("resultXY", resultXY);
	waitKey(0);
	return 0;
}

三、python代码

import cv2

img = cv2.imread("1.jpg")
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# -------------------Sobel边缘检测------------------------
x = cv2.Sobel(gray_img, cv2.CV_16S, 1, 0)
y = cv2.Sobel(gray_img, cv2.CV_16S, 0, 1)
# cv2.convertScaleAbs(src[, dst[, alpha[, beta]]])
# 可选参数alpha是伸缩系数,beta是加到结果上的一个值,结果返回uint类型的图像
Scale_absX = cv2.convertScaleAbs(x)  # convert 转换  scale 缩放
Scale_absY = cv2.convertScaleAbs(y)
result = cv2.addWeighted(Scale_absX, 0.5, Scale_absY, 0.5, 0)
# ----------------------显示结果----------------------------
cv2.imshow('img', gray_img)
cv2.imshow('Scale_absX', Scale_absX)
cv2.imshow('Scale_absY', Scale_absY)
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

四、结果展示

1、灰度图

在这里插入图片描述

2、X方向一阶边缘

在这里插入图片描述

2、Y方向一阶边缘

在这里插入图片描述

3、整幅图像的一阶边缘

在这里插入图片描述

五、相关链接

[1] python+OpenCV图像处理(八)边缘检测

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV——Sobel边缘检测 的相关文章

  • 根据给定列表中的值替换列中的值[重复]

    这个问题在这里已经有答案了 我在数据框中有一列 仅允许定义列表中存在的值 例如 给定列表 l1 1 2 5 6 如果列表中不存在列中的值 我需要将每个值替换为 0 column Expected column 1 1 5 5 2 2 3 0
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • 如何使用 watin 中的 FileUploadDialogHandler 访问文件上传对话框

    我正在使用 IE8 和 watin 并尝试通过我的网页测试上传文件 我不能简单地使用 set 方法设置上传文件 例如 ie FileUpload Find ById someId Set C Desktop image jpg 因为上传文本
  • 如何在 Sublime 2 REPL Mac 中运行 Python 3

    我的问题如下 我安装了 sublime 2 和 sublime repl 插件 一切正常 我唯一需要的是更改在控制台内置的 sublimerepl 上运行的 python 版本 我的意思是 我有 python 2 7 5 预先安装了 mav
  • Celery:每个工作人员的 task_acks_late 的不同设置/向 celery 添加自定义选项

    这个问题是后续问题django celery 禁用一个工作者的预取 有错误吗 https stackoverflow com questions 58290045 django celery disable prefetch for one
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 如何加速 pandas 字符串函数?

    我正在使用 pandas 矢量化 str split 方法来提取从 上的拆分 返回的第一个元素 我还尝试使用 df apply 与 lambda 和 str split 来产生等效的结果 使用 timeit 时 我发现 df apply 的
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 如何编写一个同时需要请求和响应Dtos的ServiceStack插件

    我需要提供本地化数据服务 所有本地化的响应 Dto 都共享相同的属性 IE 我定义了一个接口 ILocalizedDto 来标记那些 Dto 在请求端 有一个ILocalizedRequest对于需要本地化的请求 Using IPlugin
  • 如何可视化多维数据上的 kmeans 聚类

    我在 mnist 数据集上使用 kmeans 聚类算法 并希望可视化聚类后的图 到目前为止我做了这个 from mnist import MNIST mndata MNIST Datasets X train y train mndata
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • Flask 扩展未在 app.extensions 中注册

    我想访问在我的 Flask 应用程序上注册的一些扩展 我尝试使用app extensions 但我初始化的一些扩展不在字典中 from flask import current app current app extensions get
  • 用于 C# 的 TripleDES IV?

    所以当我说这样的话 TripleDES tripledes TripleDES Create Rfc2898DeriveBytes pdb new Rfc2898DeriveBytes password plain tripledes Ke
  • 在至少 7 天内连续三天登录该产品的用户

    我有一个用于用户参与的数据框 df 如下所示 time stamp user id 2013 01 01 10 05 23 1 2013 01 03 16 35 23 1 2013 01 06 11 06 35 1 2013 01 10 1
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable
  • 通过 ManyToManyField = Value 对 django 查询集进行排序

    如果有一些模型 例如 class Tag models Model name models CharField class Thing models Model title models CharField tags models Many
  • django admin 中内联模型的分页器

    我有这个简单的 django 模型 由一个传感器和特定传感器的值组成 每个日射强度计的值数量很多 gt 30k 是否可以以某种方式分页PyranometerValues在特定日期或一般情况下将分页器应用于管理内联视图 class Pyran

随机推荐

  • junit不同类指定方法批量单元测试

    批量测试不同类里面指定版本的单元测试 每个版本的批量测试如下 修改一下版本号和对应的类名即可 版本号需要在对应的单元测试方法上加 TestVersion v1 0 v1 0单元测试套件 可以指定测试类 会执行指定类里面的全部测试用例 可以指
  • 企业如何创建一个网站?

    如果企业想要创建一个网站 那么有许多选项可供选择 其中一些是简单的选择 而另一些则需要更多的专业知识和工具 但是不管选择哪种方法 都必须遵循一定的步骤才可以 下面给大家说说企业如何创建一个网站 一 注册域名 把注册域名放在第一步是因为心仪或
  • YOLO算法是干嘛的?

    学人工智能的朋友对YOLO一定不陌生 YOLO是一种目标检测算法 目标检测的任务是从图片中找出物体并给出其类别和位置 对于单张图片 输出为图片中包含的N个物体的每个物体的中心位置 x y 宽 w 高 h 以及其类别 Yolo的预测基于整个图
  • Maven安装配置教程(Windows版)

    一 Maven下载 maven下载官网地址 Maven Download Apache Maven 一 maven最新版本下载 进入这个页面 进行如图两步操作点击下载 即可下载maven最新版 bin zip文件为Windows版本 二 m
  • Box-Cox转换

    Box Cox变换后的数据 可以使回归模型满足线性 误差独立性 误差方差齐性和误差正态性 同时又不丢失信息 对存在非线性关系的数据 可以使用复杂模型拟合非线性函数来处理非线性问题 但这样的运算更复杂 先采用相对简单的数据转换来尝试将数据关系
  • 安装 Jenkins 保姆级别教程 jdk17 安装插件htmlpublisher

    文章目录 1 下载JDK17 2 下载jenkins 3 安装Jenkins 4 在页面中打开Jenkins 5 切换Jenkins的工作空间 6 安装插件 1 下载JDK17 注意区分 简称 描述 JDK java开发工具包 JRE ja
  • 使用webdriver-manager解决浏览器与驱动不匹配所带来自动化无法执行的问题

    1 前言 在我们使用 Selenium 进行 UI 自动化测试时 常常会因为浏览器驱动与浏览器版本不匹配 而导致自动化测试无法执行 需要手动去下载对应的驱动版本 并替换原有的驱动 可能还会遇到跨操作系统进行测试的时候 以及浏览器自动升级后
  • 若依框架包名修改器

    链接 https pan baidu com s 15YJCZtm28sJLcEp9EAH6aQ pwd 8n1v 提取码 8n1v
  • 用tensorflow搭建简单的CNN网络

    使用了两种不同的tensorflow API搭建了一个简单的CNN网络 用于识别mnist数据集中的手写数字 输出结果有10个类 数字0 9 网络结构只有简单的两层卷积层 全连接层 输出层 如下如图所示 搭建网络的步骤如下 读取mnist数
  • iOS开发之Xcode的静态分析(Static Code Analysis)与常见问题解决

    iOS开发之Xcode的静态分析 Static Code Analysis 与常见问题解决 一 Xcode Analyze静态分析 Static Code Analysis Static Code Analysis 静态代码分析 用来发现源
  • 【LeetCode-多线程】1116. 打印零与奇偶数

    目录 一 题目 二 解决 1 Semaphore 2 CountDownLatch 3 Thread yield 4 LockSupport 5 Thread yield 6 ReentrantLock Condition 三 参考 一 题
  • JDBC开发步骤总结

    1 加载驱动 搭建环境 I 将Oracle驱动Jar包复制到项目中的自建lib文件夹下 II ojdbc6 jar 右键 gt build path gt add to build path III Class forName oracle
  • 帆软—报表专题

    函数计算格式 if函数判断 连接运算符 concat 正则 设计器函数汇总 count 文本函数 日期时间函数 逻辑switch函数 函数使用位置 https help fanruan com finereport10 0 doc view
  • ipad上linux终端,如何使用iSH在iPad或iPhone上获取Linux Shell

    您是否曾经希望在iPad或iPhone上安装Linux命令行 使用iSH 您可以非常接近实现该目标 iSH Shell是适用于iOS的Linux Shell 它使用x86模拟器在iPad或iPhone上运行Alpine Linux的简化版本
  • uniapp微信小程序外壳内联H5实现支付

    业务场景 用户有现成的微信H5应用 有微信支付 用户想要一个一摸一样的小程序版本 但是又不想高成本去重新开发 所以可以考虑采用小程序的web view组件内联现有的微信H5应用 哇简直不要再偷懒了 简直就是分分钟搞定的事 是不是太简单了 给
  • 网络安全是什么?如何成为一位优秀的网络安全工程师/黑客?

    网络安全是什么 首先说一下什么是网络安全 网络安全工程师工作内容具体有哪些 网络安全是确保网络系统的硬件 软件及其系统中的数据受到保护 不因偶然的或者恶意的原因而受到破坏 更改 泄露 系统连续可靠正常地运行 保障网络服务不被中断 网络安全工
  • java实现短链接得到长链接!!!

    java实现短链接得到长链接 重点 params setParameter ClientPNames HANDLE REDIRECTS false 禁止重定向 不设置 有些短链接 获取不到headers里的Location HttpClie
  • chrome 全屏模式 隐藏地址栏_6个Chrome隐藏的小技巧,你可能不知道但很实用

    Chrome占据了浏览器的大半壁江山 不少人也是将它作为电脑的默认浏览器 而它也确实非常强大 拥有着非常快的速度以及丰富的插件 同时它也隐藏了不少实用的功能 通过挖掘它们让我们更加意识到Chrome的强大 以下便是我们收集的6个不为大众所熟
  • Linux用户环境变量、系统环境变量和PATH变量

    目录 一 用户环境变量 二 系统环境变量 三 PATH变量 1 修改PATH环境变量 一 用户环境变量 PS 修改文件执行权限案例 1 在文本编辑器中新建一个shell脚本 直接执行这个文件会发现权限不够 以详细模式查看这个文件的权限 发现
  • OpenCV——Sobel边缘检测

    目录 一 Sobel算法 1 算法概述 2 主要函数 二 C 代码 三 python代码 四 结果展示 1 灰度图 2 X方向一阶边缘 2 Y方向一阶边缘 3 整幅图像的一阶边缘 五 相关链接 一 Sobel算法 1 算法概述 Sobel边