OpenCV:十五、Laplance算子

前言

在上一章中描述了Sobel边缘检测算子,详细描述可点击查看(https://www.jianshu.com/writer#/notebooks/47386368/notes/82286161)

目标

本章中,将学习:

  • Laplance算子理论
  • 相关API
  • 代码演示

Laplance算子理论

  • 理论:在二阶导数的时候,最大变化处的值为零即边缘是零值。通过二阶导数计算,依据此理论我们可以计算图像二阶导数,提取边缘。


    拉普拉斯算子理论.png

    对应的算子梯度如下:


    拉普拉斯梯度.png

    还是上面这个图像,我们求一阶导数之后,还能求其二级导数。这个时候,当初图像上变化最大的位置,二阶导数为0,首先我们看一下离散的一阶导数的计算方法:
    一阶导数.png

    再对一阶导数求导得出二阶导数:


    二阶导数.png

    因为图像有行列两个方向,所以要两个方向分别求导数:
    梯度.png

    拉普拉斯算子由OpenCV函数cv::Laplacian实现。实际上,由于拉普拉斯算子使用图像的梯度,因此它在内部调用Sobel算子来执行其计算。
  • 处理流程
    1.高斯模糊 - 去噪声GaussianBlur()
    2.转换为灰度图像cvtColor()
    3.拉普拉斯 - 二阶导数计算Laplacian()
    4.取绝对值convertScaleAbs()
    5.显示结果

相关API

void Laplacian( 
    InputArray src, 
    OutputArray dst, 
    int ddepth,  
    int ksize = 3,
    double scale = 1,                       
    double delta = 0, 
    int borderType = BORDER_DEFAULT 
);
  • InputArray类型的src ,输入图像。
  • OutputArray类型的dst ,输出图像,图像的大小、通道数和输入图像相同。
  • int类型的ddepth,目标图像的所需深度。
  • int类型的ksize,用于计算二阶导数滤波器的孔径大小。大小必须是正数和奇数。
  • double类型的scale,计算拉普拉斯值的可选比例因子。默认情况下,不应用缩放。
  • double类型的delta,在将筛选的像素存储到dst中之前添加到这些像素的可选值。说的有点专业了其实就是给所选的像素值添加一个值delta。
  • int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT。

代码演示

int main(int argc, char** argv) {
    Mat src, dst;
    src = imread(STRPAHT2);
    if (!src.data) {
        printf("could not load image");
    }

    //降噪
    Mat gray_src, edge_image;
    GaussianBlur(src, dst, Size(3, 3), 0, 0);
    //灰度
    cvtColor(dst, gray_src, CV_BGR2GRAY);

    //拉普拉斯 – 二阶导数计算Laplacian()
    Laplacian(gray_src, edge_image, CV_16S, 3);

    //取绝对值
    convertScaleAbs(edge_image, edge_image);
    //二值化
    threshold(edge_image, edge_image, 0, 255, THRESH_OTSU | THRESH_BINARY);
    imshow("Laplaiance", edge_image);

    waitKey(0);
    return 0;
}
效果图.png

你可能感兴趣的:(OpenCV:十五、Laplance算子)