Opencv(C++)学习系列---Sobel索贝尔算子边缘检测

2023-11-08

目录

【1】算法简介

【2】算子参数介绍

【3】完整代码


【1】算法简介

        Sobel算子是一种用于边缘检测的线性滤波器,如果把图像看做是一个二维函数,那么Sobel算子就是图像在垂直和水平方向上变化的速度(即梯度)。Sobel算子在水平和垂直方向上做像素值的差分,能够得到图像梯度的近似值,在像素周围进行运算时,能够减少噪声带来的影响。

其对应的内核函数为:

6a0c3bdbe6704354a2cf6da18b8a0f77.png

       Sobel算子检测方法对灰度渐变和噪声较多的图像处理效果较好,sobel算子对边缘定位不是很准确,图像的边缘不止一个像素;当对精度要求不是很高时,是一种较为常用的边缘检测方法。对于细小边缘检测要求较高的,可以采用scharr算子,它是在sobel算子的基础上进行改进,在不影响检测速度的前提下,提高了边缘检测的精度。

        sobel算子和scharr算子他们的卷积核大小是一样的。这意味着他们计算起来,工作量是一样的。

de7e41baabf84dfbac42fa2ad6510297.png

 具体算法流程可以参考这篇文章:

https://blog.csdn.net/great_yzl/article/details/119709699?ops_request_misc=&request_id=&biz_id=102&utm_term=opencv%20sobel%E8%BE%B9%E7%BC%98%E6%A3%80%E6%B5%8B&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-4-119709699.nonecase&spm=1018.2226.3001.4187目录一、基础理论二、实战1、对x方向微分2、对y方向微分3、线性混合总代码参考资料一、基础理论Sobel算子:用于边缘检测的离散微分算子。梯度公式:对于图像而言,它是离散的,所以h的最小值只能是1了,那么这意味着,图像中某个像素位置的梯度(以x方向为例)等于它左右两个像素点的像素之差除以2。例:假设有一行像素是这样分布的:123 155 173那么,像素值为155的像素位置x方向的梯度为(173 - 123)/2 = 25Prewit...https://blog.csdn.net/great_yzl/article/details/119709699?ops_request_misc=&request_id=&biz_id=102&utm_term=opencv%20sobel%E8%BE%B9%E7%BC%98%E6%A3%80%E6%B5%8B&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-4-119709699.nonecase&spm=1018.2226.3001.4187

【2】算子参数介绍

cv::Sobel(image, // 输入的图像可以是三通道,也可是单通道
          sobel, // 输出
          image_depth, // 图像类型
          xorder,yorder, // 内核规格
          kernel_size, // 正方形内核的尺寸
          alpha, beta); // 比例和偏移量

参数简介:

      输出图像的像素类型是可以选择的:无符号字符型、有符号整数或浮点数。对于sobel算子而言一般选择类型为CV_16S。如果结果超出了像素值域的范围,就会进行饱和度运算,在生成最终图像之前,可以将结果缩放(相乘)alpha倍,并加上偏移量beta。

        每个Sobel 掩码都是一个方向上的导数,因此要用两个参数来指明将要应用的内核,即x方向和y 方向导数的阶数。例如,如果xorder和yorder分别为1 和0,则得到水平方向Sobel内核;如果分别是0和1,则得到垂直方向的内核。内核的尺寸也可以大于3×3。可选的尺寸有1、3、5 和7。内核尺寸为1,表示一维Sobel 滤波器(1×3 或3×1)。

【3】完整代码

#include<opencv2\opencv.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\highgui\highgui.hpp>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	//载入原始图
	Mat src = imread("E:\\乔大花进度\\11-28\\边缘检测\\3.jpg");
	//【1】创建abs_grad_x,abs_grad_y,dst矩阵;
	Mat grad_x, grad_y;
	Mat abs_grad_x,abs_grad_y,dst;

	//【2】显示原始图
	imshow("原始图",src);

	//【3】求x方向梯度
	Sobel(src,grad_x,CV_16S,1,0,3);
	convertScaleAbs(grad_x,abs_grad_x);

	imshow("x方向sobel",abs_grad_x);

	Scharr(src, grad_y, CV_16S, 0, 1, 9);
	convertScaleAbs(grad_y,abs_grad_y);
	imshow("y方向sobel",abs_grad_y);

	//【5】合并梯度(近似)
	addWeighted(abs_grad_x,0.5,abs_grad_y,0.5,0,dst);
	cout << "Sobel输出图像的类型为:" << dst.type() << endl;
	cout << "Sobel输出图像的通道数" << dst.channels() << endl;
	imshow("整体效果",dst);

	waitKey(0);
	system("pause");
	destroyAllWindows();

	return 0;

}

运行结果:

e0540586ea55488791819b954c8b1c99.png

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

Opencv(C++)学习系列---Sobel索贝尔算子边缘检测 的相关文章

  • 将 RGB 转换为黑色或白色

    我如何在Python中获取RGB图像并将其转换为黑白图像 不是灰度 我希望每个像素要么是全黑 0 0 0 要么是全白 255 255 255 流行的 Python 图像处理库中是否有任何内置功能可以完成此任务 如果不是 最好的方法是循环遍历
  • caffe安装:opencv libpng16.so.16链接问题

    我正在尝试在 Ubuntu 14 04 机器上使用 python 接口编译 caffe 我已经安装了 Anaconda 和 opencvconda install opencv 我还安装了咖啡中规定的所有要求 并更改了注释块makefile
  • 从一个 Mat 复制到另一个 Mat 仅接近黑色像素

    I have Mat difference其中有一些黑色像素 或者几乎是黑色像素 gt 如果发生地震 建筑物会移动等 并且Mat current它由具有自然色彩的真实图像组成 我想替换中的像素Mat current这些黑色像素Mat dif
  • 使用 Unity3D 解决 PnP

    我有一个真实 物理的棍子 上面连接有红外摄像头和一些红外 LED 它们形成了我正在使用的模式 以便使虚拟棍子以与物理棍子相同的方式移动 为此 我在 Python 中使用 OpenCV 并将由solvePnP 计算的旋转和平移向量发送到 Un
  • 用于 C++ 中图像分析的 OpenCV 二进制图像掩模

    我正在尝试分析一些图像 这些图像的外部周围有很多噪声 但内部有一个清晰的圆形中心 中心是我感兴趣的部分 但外部噪声正在影响我对图像的二进制阈值处理 为了忽略噪音 我尝试设置一个已知中心位置和半径的圆形蒙版 从而使该圆之外的所有像素都更改为黑
  • 从单应性估计 R/T

    我一直在尝试计算 2 个图像中的特征 然后将这些特征传递回CameraParams R没有运气 特征已成功计算并匹配 但是问题是将它们传递回R t 我明白你必须分解Homography为了使这一点成为可能 我已经使用如下方法完成了 http
  • OpenCV 中“IplImage”和“CvMat”的全称是什么?

    有一个IplImage and CvMat在 OpenCV 中 他们的全名是什么 IPL in IplImage代表英特尔处理库 这是Intel维护OpenCV时的残余 CV in cvMat代表计算机视觉矩阵 这是图形中常用的数据结构 I
  • Opencv - 找不到头文件

    我正在尝试使用 opencv 开始开发 问题是 到目前为止我几乎无法设置 opencv 因为我找不到它的头文件 我对此主题进行了一些研究 但没有一个真正有帮助 下面是一些链接 opencv2 包含文件在哪里 https stackoverf
  • 有人曾经在 MacOS 10.6 上使用过 OpenCV 和 Python 2.7 吗?

    在过去的 6 个月里 我一直断断续续地尝试让 OpenCV 在 MacOS 上与 Python 配合使用 每次有新版本发布时 我都会再次尝试并失败 我已经尝试过 64 位和 32 位 并且 xcode gcc 和 gcc 都是通过 macp
  • OpenCV,捕获的视频比原始相机视频运行得更快!

    我正在使用 openCV 从相机捕获视频并将其存储到 avi 文件 问题是当我完成捕获并运行 avi 文件时 视频流看起来速度很快 这是代码 void main CvCapture capture cvCaptureFromCAM 0 in
  • ValueError:当数组不是序列时设置带有序列的数组元素

    您好 此代码旨在存储使用 open cv 绘制的矩形的坐标 并将结果编译为单个图像 import numpy as np import cv2 im cv2 imread 1 jpg im3 im copy gray cv2 cvtColo
  • OpenCV:如何使用图像计算相机和物体之间的距离?

    我是 OpenCV 的新手 我正在使用以下公式来计算距离 distance to object mm focal length mm real height of the object mm image height pixels obje
  • 使用 cv2 在 python 中创建多通道零垫

    我想用 cv2 opencv 包装器在 python 中创建一个多通道 mat 对象 我在网上找到了一些例子 其中 c Mat zeros 被 numpy zeros 替换 这看起来不错 但似乎没有多通道类型适合 看代码 import cv
  • 基本的 Python OpenCV 裁剪和调整大小

    有人可以帮我一些裁剪算法吗 它的 openCV 我想弄清楚这一点 我知道方法是crop image y y1 x x1 如果我有一个带有 new dimensionXxnew dimensionY 像素的图像 并且我想将其裁剪为相同的宽度
  • 如何将 OpenCV 的测试框架与 CMake 结合使用?

    好像 OpenCV 有一个测试框架 https github com Itseez opencv tree ef91d7e8830c36785f0b6fdbf2045da48413dd76 modules ts include opencv
  • 如何平滑循环列向量

    这是一个 OpenCV2 问题 我有一个矩阵代表closed空间曲线 cv Mat
  • 如何将 Opencv VideoWriter 与 GStreamer 结合使用?

    我正在尝试使用 Opencv VideoWriter 传输 h264 流 以使用 VideoCapture 将其传输到网络上的另一台电脑上 但是 我被困在 VideoWriter 上 执行此代码会返回错误 并且 out isOpened 始
  • OpenCv 与 Android studio 1.3+ 使用新的 gradle - 未定义的参考

    我在使用原生 OpenCv 2 4 11 3 0 0 也可以 和 Android Studio 1 3 以及新的 ndk 支持时遇到问题 所有关于 mk 文件的教程 但我想将它与新的实验性 gradle 一起使用 使用 Kiran 答案An
  • Opencv C++ 检测并裁剪图像上的白色区域

    我在网上搜索过 已经找到了一些方法来完成我想要的事情 但是与我需要的相比 这些方法的效率较低 我有一个 kinect 使用 Microsoft SDK 当前正在获取一个移除背景的人 将结果保存在 3 通道 Mat 中 并将该人从背景中移除
  • 在 HSV 颜色空间内定义组织学图像掩模的颜色范围(Python、OpenCV、图像分析):

    为了根据颜色将组织学切片分成多个层 我修改了 OpenCV 社区提供的一些广泛分布的代码 1 我们的染色程序用不同的颜色标记组织横截面的不同细胞类型 B 细胞为红色 巨噬细胞为棕色 背景细胞核为蓝色 I m interested in se

随机推荐

  • Texture Format全解析

    Texture Format全解析 Texture Format全解析 What internal representation is used for the texture This is a tradeoff between size
  • sqlmap的安装及使用教程

    1 sqlmap简介 sqlmap 是一个开源渗透测试工具 可自动检测和利用 SQL 注入缺陷并接管数据库服务器 支持多种数据库和多种注入技术 2 sqlmap安装 sqlmap是基于python环境的 因此安装前需要安装python环境
  • Vue + element中table来回切换页面显示差异问题

    这次做项目遇到多个table切换页面显示差异的问题 当我切换到上个页面的时候 表格有一列是下个页面的内容 切换到下个页面的时候那一列的内容消失了 就很奇葩 这个问题也是我都一次遇到 问了Baidu阿姨 上面的解决办法好像都不行 这个时候感觉
  • esxi能直通的显卡型号_虚拟黑群也可以NVMe加速?还能万兆?wa!

    之前我发了三篇关于FreeBSD虚拟机安装黑群晖的文章 没有阅读的同学可以看一下 钱乎 如何拥有一台100T容量的NAS Let s do it zhuanlan zhihu com 钱乎 100TB的NAS之后续填坑 虚拟硬件篇 zhua
  • Gradle sync failed: Sync failed: reason unknown

    android项目复制后打开总是报这个错误 打开build查看红色错误提示 比如提示缺少android 23 打开file gt setting 展开后把对应的SDK勾选上再ok
  • 2021计算机考硕复试线,2021考研复试线汇总:国家线+34所中5所院校复试线①

    原标题 2021考研复试线汇总 国家线 34所中5所院校复试线 突如其来 昨天晚上 中国教育发布 公布了2021年硕士研究生考试学术学位类和专业学位类的国家线 随后 34中的5所院校也更新了2021年复试线成绩 包含以下这5所院校 清华大学
  • vue项目Error: Cannot find module ‘xxx’类报错的解决方法

    现发现只要是报错 Error Cannot find module xxx 例如 Error Cannot find module webpack 这类的问题都可以用下面的方法解决 报错内容如下 运行 npm install 没问题 运行
  • 消息队列的两种模式

    Java消息服务 Java Message Service JMS 应用程序接口是一个Java平台中关于面向消息中间件 MOM 的API 用于在两个应用程序之间 或分布式系统中发送消息 进行异步通信 点对点与发布订阅最初是由JMS定义的 这
  • Box2D C++ 教程-物体

    Box2D C 教程 物体 物体 Bodies 物体是物理场景中的基本对象 但是这里的物体并不是你看到的实际互相弹跳碰撞的实物 听起来很费解吗 挺住 马上做解释 http ohcoder com blog 2012 11 29 bodies
  • springboot+log4j2遇到的坑

    情景再现 按照网上一般的教程 这样 并添加 去除 common logging的jar 实际过程中 仍然报错会发出警告 大概意思如下 slfj仍然用着springboot默认的logback 包有冲突 所以第一图并没有起作用 而且logba
  • 【20200326】数据挖掘课程课业打卡三

    20200326 数据挖掘课业打卡三之数据质量 数据挖掘课业打卡三之数据质量 一 单选题 二 填空题 三 判断题 知识点汇总 1 数据中可能存在的问题 2 数据预处理方法 3 关于欧几里得距离 叮嘟 这里是小啊呜的学习课程资料整理 好记性不
  • the host '192.168.2.100'is unreachable,The host may be down,or there may be a problem with......解决办法

    我这里遇到这样的问题 是因为网关和网络IP没有配置对造成的 解决办法如下 第一步 打开VM 点中要操作的虚拟机 鼠标点击左上角 编辑 虚拟网络编辑器 如下图所示 第二步 若是选择自定义网关 即选择如上图的VMnet8模式 选中VMnet8
  • WebSocket整合spring 一文全部搞定

    文章声明 本文简单整合了webSocket 组件 涉及到的源码分解 原理什么的以后再说 本文只适合入门小白体验 不涉及复杂业务逻辑 文章目录 1 引入webSocket依赖包 2 声明式整合WebSocket 这是一道硬菜 2 1 webS
  • C++STL模板库——deque容器

    今天介绍的是双端队列deque 也是STL中非常重要的内容 include
  • QT/QTCreator开发/使用技巧

    调试模式完整的展示过长的字符串 如图 当字符串过长时在调试模式下 无法非常清晰的看到全部的字符串 此时可以通过 右键菜单 change value display format spearate Window 此时字符串将单独显示在一个独立
  • 自己动手实现java 动态代理

    前言 上一篇讲到jdk动态代理的实现 现在来讲一下自己动手实现java 动态代理 上一篇 jdk 动态代理 2 自定义实现 分析 想要自定义实现 有5个步骤 生成增强类源代码 把源代码输出到磁盘 编译成class文件 加载到jvm中 返回被
  • stream的.findAny().orElse (null) 是什么意思?

    List
  • 判断当前浏览器环境是否是移动端

    一 直接上代码 测试移动端环境 function isMobileNavigator let flag navigator userAgent match phone pad pod iPhone iPod ios iPad Android
  • SET的用法

    写给自己看的小tips set set中插入一个元素 insert s1 str1 set中删除一个元素可以这样写 1 2 3 4 5 6 7 8 9 for set
  • Opencv(C++)学习系列---Sobel索贝尔算子边缘检测

    目录 1 算法简介 2 算子参数介绍 3 完整代码 1 算法简介 Sobel算子是一种用于边缘检测的线性滤波器 如果把图像看做是一个二维函数 那么Sobel算子就是图像在垂直和水平方向上变化的速度 即梯度 Sobel算子在水平和垂直方向上做