OpenCV-Sobel边缘检测

Posted 翟天保Steven

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV-Sobel边缘检测相关的知识,希望对你有一定的参考价值。

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

函数原型

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算子结合了高斯平滑和分化,所以结果具备一定抗噪性哦~

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

以上是关于OpenCV-Sobel边缘检测的主要内容,如果未能解决你的问题,请参考以下文章

图像的亚像素边缘检测 MATLAB代码

matlab图像如何用代码完成图像的分割、边缘检测和拼接的任务?

图像边缘检测基于matlab Zernike矩亚像素边缘检测含Matlab源码 1536期

OpenCV——Sobel边缘检测

OpenCV——Canny边缘检测

Matlab边缘检测问题