Laplacian算子

上述边缘算子都具有方向性,因此需要分别求取X方向的边缘和Y方向的边缘,之后将两个方向的边缘综合得到图像的整体边缘

Laplacian算子具有各方向同性的特点,能够对任意方向的边缘进行提取,具有无方向性的优点

因此,使用Laplacian算子提取边缘不需要分别检测X方向的边缘和Y方向的边缘,只需要一次边缘检测

Laplacian算子是一种二阶导数算子,对噪声比较敏感,因此常需要配合高斯滤波一起使用

OpenCV4提供了通过Laplacian算子提取图像边缘的Laplacian()函数

Laplacian()函数原型:

void Laplacian(InputArray src,
               OutputArray dst,
               int ddepth,
               int ksize = 1,
               double = scale = 1,
               double = delta = 0,
               int borderType = BORDER_DEFAULT
               )
  • src:输入原始图像,可以为灰度图像或彩色图像
  • dst:输出图像,与输入图像src具有相同的尺寸二号通道数
  • ddepth:输出图像的数据类型(深度),根据输入图像的数据类型不同,拥有不同的取值范围(表:图像卷积)

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

  • ksize:滤波器的大小,必须为正奇数
  • scale:对导数计算结果进行缩放的缩放因子,默认系数为1,表示不缩放
  • delta:偏值,在计算结果中加上偏值
  • borderType:像素外推选择标志,默认为BORDER_DEFAULT,表示不包含边界值的倒序填充(2.3.4仿射变换)

该函数利用Laplacian算子提取图像中的边缘信息,与Sobel()函数相同

前两个参数分别为输入图像和输出图像,第三个参数为输出图像的数据类型,由于提取边缘信息时可能出现负数,因此不要使用CV_8U数据类型的输出图像,否则会使得图像边缘提取不准确

该函数的第四个参数是滤波器的尺寸的大小,必须是正奇数

当参数值大于1时,该函数通过Sobel算子计算出图像X方向和Y方向的二阶导数,将两个方向的导数求和得到Laplacian算子

后三个参数多数情况下使用默认参数

示例程序:由于Laplacian算子对图像中的噪声较为敏感

因此使用Laplacian算子对高斯滤波后的图像和未进行高斯滤波的图像进行边缘检测

示例:

#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 result,result_g,result_G;
    //未进行滤波提取Laplacian边缘
    Laplacian(img,result,CV_16S,3,1,0);
    convertScaleAbs(result,result);
    //滤波后提取Laplacian边缘
    GaussianBlur(img,result_g,Size(3,3),5,0); //高斯滤波
    Laplacian(result_g,result_G,CV_16S,3,1,0);
    convertScaleAbs(result_G,result_G);
    //显示图像
    imshow("result",result);
    imshow("result_G",result_G);
    waitKey(0);
    return 0;
}

注:图像去除噪声后通过Laplacian算子提取边缘变得更加准确

results matching ""

    No results matching ""