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

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



【1】算法简介

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

其对应的内核函数为:

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

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

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

【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;
}

运行结果:

相关文章
|
9天前
|
编译器 开发工具 C语言
配置C++的学习环境
这篇教程介绍了学习C++语言所需的环境配置和软件选择。首先,你需要一个文本编辑器(如Visual Studio Code、Visual Studio、Vim、Emacs或Eclipse)和一个C++编译器(如GCC)。在不同操作系统上安装GCC的方法包括:在Linux或UNIX上使用命令行检查或安装GCC,在Mac OS X上通过Apple的Xcode,而在Windows上则需要安装MinGW。教程还提供了使用Visual Studio创建和编译C++程序的步骤。最后,文章简述了g++编译器的使用及其常用命令选项。
19 0
|
15天前
|
算法 编译器 C语言
从C语言到C++⑩(第四章_模板初阶+STL简介)如何学习STL(下)
从C语言到C++⑩(第四章_模板初阶+STL简介)如何学习STL
23 0
|
15天前
|
编译器 C语言 C++
从C语言到C++⑩(第四章_模板初阶+STL简介)如何学习STL(上)
从C语言到C++⑩(第四章_模板初阶+STL简介)如何学习STL
11 0
|
15天前
|
编译器 C语言 C++
从C语言到C++①(第一章_C++入门_上篇)C++学习介绍(命名空间和C++输入输出流)(下)
从C语言到C++①(第一章_C++入门_上篇)C++学习介绍(命名空间和C++输入输出流)
20 0
|
15天前
|
Java 编译器 C#
从C语言到C++①(第一章_C++入门_上篇)C++学习介绍(命名空间和C++输入输出流)(上)
从C语言到C++①(第一章_C++入门_上篇)C++学习介绍(命名空间和C++输入输出流)
30 0
|
19天前
|
算法 计算机视觉
OpenCV高斯差分技术实现图像边缘检测
OpenCV高斯差分技术实现图像边缘检测
|
21天前
|
编译器 C++
【C++】继续学习 string类 吧
首先不得不说的是由于历史原因,string的接口多达130多个,简直冗杂… 所以学习过程中,我们只需要选取常用的,好用的来进行使用即可(有种垃圾堆里翻美食的感觉)
11 1
|
21天前
|
计算机视觉
OpenCV图像运动模糊
OpenCV图像运动模糊
17 0
|
21天前
|
计算机视觉
OpenCV图像阈值
OpenCV图像阈值
7 0
|
21天前
|
计算机视觉
OpenCV图像混合
OpenCV图像混合
14 0