OpenCV-Sobel边缘检测

简介: OpenCV-Sobel边缘检测

函数原型

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 );


参数说明

  1. InputArray类型的image,输入图像,8位图像。
  2. OutputArray类型的dst,输出图像。
  3. int类型的ddepth,输出图像的深度。若src为CV_8U,则可取-1/CV_16S/CV_32F/CV_64F;若src为CV_16U/CV_16S,可取-1/CV_32F/CV_64F;若src为CV_32F,可取-1/CV_32F/CV_64F;若src为CV_64F,可取-1/CV_64F。
  4. int类型的dx,x方向上的差分阶数。
  5. int类型的dy,y方向上的差分阶数。
  6. int类型的ksize,默认值为3,表示Sobel核的大小,取奇数。
  7. double类型的scale,计算导数值时选的缩放因子,默认为1。
  8. double类型的delta,表示在结果存入目标图之前可选的delta值,默认为0。
  9. int类型的borderType,边界模式。


函数原理

      Sobel算子是一个主要用于边缘检测的离散微分算子。它结合了高斯平滑和微分求导,用来计算图像灰度函数的近似梯度。在图像的任何一点使用此算子,都会产生对应的梯度矢量或法矢量。


      Soble算子的计算步骤:


1.假设图像为I,分别在x和y方向求导。


1)水平方向将I与一个奇数大小的内核进行卷积,所得结果为Gx:

2)垂直方向将I与一个奇数大小的内核进行卷积,所得结果为Gy:

2.在图像的每一点,结合Gx和Gy求出近似梯度G:

测试代码

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
using namespace std;
using namespace cv;
int main()
{
  Mat src = imread("test.jpg");
  Mat gradx, grady, absgradx, absgrady, result;
  // X方向梯度
  Sobel(src, gradx, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT);
  convertScaleAbs(gradx, absgradx);
  // Y方向梯度
  Sobel(src, grady, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT);
  convertScaleAbs(grady, absgrady);
  // 梯度相加
  addWeighted(absgradx, 0.5, absgrady, 0.5, 0, result);
  // 结果显示
  imshow("src", src);
  imshow("x", absgradx);
  imshow("y", absgrady);
  imshow("result", result);
  waitKey(0);
  return 0;
}

测试效果

图1 原图

图2 x方向sobel

图3 y方向sobel

图4 整体方向sobel

      因为Sobel算子结合了高斯平滑和分化,所以结果具备一定抗噪性哦~

      如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

相关文章
|
2月前
|
算法 计算机视觉
OpenCV(二十六):边缘检测(二)
OpenCV(二十六):边缘检测(二)
23 0
|
2月前
|
计算机视觉
OpenCV(二十五):边缘检测(一)
OpenCV(二十五):边缘检测(一)
29 0
|
5月前
|
算法 计算机视觉 Python
OpenCV中Canny边缘检测和霍夫变换的讲解与实战应用(附Python源码)
OpenCV中Canny边缘检测和霍夫变换的讲解与实战应用(附Python源码)
78 0
|
4天前
|
计算机视觉
【OpenCV】-边缘检测汇总示例
【OpenCV】-边缘检测汇总示例
|
2月前
|
算法 C++ 计算机视觉
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
|
2月前
|
算法 计算机视觉 C++
Opencv(C++)学习系列---Sobel索贝尔算子边缘检测
Opencv(C++)学习系列---Sobel索贝尔算子边缘检测
|
2月前
|
算法 C++ 计算机视觉
Opencv(C++)学习系列---Canny边缘检测算法
Opencv(C++)学习系列---Canny边缘检测算法
|
4月前
|
监控 算法 开发工具
Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现获取图像并对图像进行边缘检测(C++)
Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现获取图像并对图像进行边缘检测(C++)
28 1
|
9月前
|
计算机视觉
opencv之 边缘检测(canny)
opencv之 边缘检测(canny)
|
5月前
|
计算机视觉
搭配:基于OpenCV的边缘检测实战
搭配:基于OpenCV的边缘检测实战