Sobel算子

Sobel算子是通过离散微分方法求取图像边缘的边缘检测算子,求取边缘的思想与边缘检测原理一致

除此之外, Sobel算子还结合了高斯平滑滤波的思想,将边缘检测滤波尺寸由Ksize改进为ksize x ksize

提高了对平缓区域边缘的响应,相比前文的算法边缘检测,效果更加明显,使用Sobel边缘算子提取的过程大致可以分为以下3个步骤

第一步:提取X方向的边缘,X方向一阶Sobel边缘算子如下:

第二步:提取Y方向的边缘,Y方向一阶Sobel边缘算子如下:

第三步:综合两个方向的边缘信息得到整幅图像的边缘,由两个方向的边缘得到整体的边缘由两种计算方式

第一种是求取两幅图像对应像素的像素值的绝对值之和,第二种是求取两幅图像对应像素的像素值的平方和的二次方根

OpenCV4提供了对图像提取Sobel边缘的Sobel()函数

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
           )
  • src:待提取边缘的图像
  • dst:输出图像,与输入图像src具有相同的尺寸和通道数,数据类型由第三个参数ddepth控制
  • ddepth:输出图像的数据类型(深度),根据输入图像的数据类型不同,拥有不同的取值范围(表:图像卷积)

当赋值为-1时,输出图像的数据类型自动选择

  • dx:X方向的差分阶数
  • dy:Y方向的差分阶数
  • ksize:Sobel算子的尺寸,必须是1、3、5或者7
  • scale:对导数计算结果进行缩放因子,默认系数为1,表示不缩放
  • delta:偏值,在计算结果中加上偏值
  • borderType:像素外推选择标志,默认为BORDER_DEFAULT,表示不包含边界值的倒序填充

该函数的使用方法与分离卷积函数sepFilter2D()相似,前两个参数为输入图像和输出图像,第三个参数为输出图像的数据类型

由于提取边缘信息时可能出现负数,因此不要使用CV_8U数据类型的输出图像,因为于Sobel算子方向不一致的边缘梯度会在

CV_8U中消失,使得图像边缘提取不准确,该函数第四、五、六个参数是控制图像边缘检测效果的关键参数

三者存在关系是任意一个方向的差分阶数必须要小于算子的尺寸

在一般情况下:

当差分阶数最大值为1时,算子尺寸选3;

当差分阶数最大值为2时,算子尺寸选5;

当差分阶数最大值为3时,算子尺寸选7

特殊情况:当ksize = 1时,任意一个方向的阶数需要小于3(此时使用的算子尺寸不再是正方形,而是3x1或者1x3)

最后三个参数分别为图像缩放因子、偏值和图像外推填充方法,多数情况下采用默认参数

示例:

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
    //读取图像,黑白图像边缘检测结果较为明显
    Mat img = imread("E:\\CLion\\opencv_xin\\SG\\SG_0.jpg",IMREAD_ANYCOLOR);
    if (img.empty())
    {
        cout << "error" << endl;
        return -1;
    }
    Mat resultX,resultY,resultXY;
    //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;
}

results matching ""

    No results matching ""