OpenCV-C++ Laplance算子

拉普拉斯理论说明

待补充;

Laplacian API使用介绍

计算图像的拉普拉斯算子,用于图像边缘检测;

OpenCV中Laplacian的使用方式:

void Laplacian( InputArray src, OutputArray dst, int ddepth,
               int ksize = 1, double scale = 1, double delta = 0,
               int borderType = BORDER_DEFAULT );

该函数通过使用Sobel算子计算出的二阶x,y的导数相加来计算源图像的拉普拉斯算子:

\[dst = \Delta src = \dfrac{\partial^2 src}{\partial x^2} + \dfrac{\partial^2src}{\partial y^2} \]

如果ksize=1,则该函数计算拉普拉斯算子的方式是利用下面的核进行计算:

其中:

  • src表示源图像;
  • dst表示输出;
  • ddepth表示输出位数,需要比源图像大;
  • ksize表示核大小;
  • scale表示缩放系数;
  • delta表示偏移量;
  • borderType表示对图像边界如何处理;

拉普拉斯算子实现图像边缘检测

类似于使用Sobel进行图像边缘检测,包含以下步骤:

  • 高斯模糊
  • 转灰度图
  • 拉普拉斯-计算二阶导数
  • 取绝对值convertScaleAbs()
  • 显示结果

结果如下:

完成程序如下:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

/**
 * 边缘处理
*/

int main(){
    // 读取图像
    Mat src = imread("/home/chen/dataset/lena.jpg");
    if (src.empty()){
        cout << "could not load image." << endl;
        return -1;
    }
    namedWindow("src", WINDOW_AUTOSIZE);
    imshow("src", src); 

    // 1. 高斯模糊
    Mat srcBlur;
    GaussianBlur(src, srcBlur, Size(3, 3), 0, 0);

    // 2. 转灰度图
    Mat srcGray;
    cvtColor(srcBlur, srcGray, COLOR_BGR2GRAY);
    cout << srcGray.type() << endl;

    // 3. 拉普拉斯-计算二阶导数
    Mat srcGrad;
    Laplacian(srcGray, srcGrad, CV_16S, 3);

    Mat dst;
    convertScaleAbs(srcGrad, dst);
    threshold(dst, dst, 0, 244, THRESH_OTSU);

    namedWindow("dst", WINDOW_AUTOSIZE);
    imshow("dst", dst);   
    waitKey(0); 
    return 0;
}
posted @ 2021-04-19 22:54  chenzhen0530  阅读(614)  评论(0编辑  收藏  举报