【OpenCV4】拉普拉斯算子提取边缘 cv::Laplacian() 用法详解和代码示例(c++)

作用原理:

拉普拉斯算子可以用于边缘检测,同时该算子不具有方向性,可以同时检测到 X 方向和 Y 方向的边缘,综合后检测出图像的边缘。

即拉普拉斯算子是 各向同性 的,这在很多情况下是一个优点,因为我们一般来说会同时关注 X 方向和 Y 方向的边缘,所以这时候就不需要做两次,一次边缘检测就能得到结果。

这里要注意的是,拉普拉斯算子是一种 二阶导数 算子,所以对噪声很敏感,在实际运用中通常会搭配高斯滤波一起用。

公式:

在这里插入图片描述

函数原型:


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

解析:

  • src:输入图像
  • dst:输出图像(尺寸和通道数与输入一致)
  • ddepth:目标数据类型(位深,比如 CV_32F)
  • ksize:用于计算滤波器二阶导数的孔径尺寸(必须是正奇数)
  • scale:计算所得拉普拉斯值的缩放因子(可选,默认没有缩放)
  • delta:对计算结果整体做一个正向偏移(可选,默认没有偏移)
  • borderType:边界外推方法

注: 当 ksize=1 时,拉普拉斯算子滤波器为 3X3 的孔径,如下:
【OpenCV4】拉普拉斯算子提取边缘 cv::Laplacian() 用法详解和代码示例(c++)_第1张图片
后三个参数一般选择默认值

代码示例:

void TestLaplacian()
{
    cv::Mat lena = cv::imread("lena.jpg", 1);
    cv::Mat blured;
    cv::Mat result_1;
    cv::Mat result_2;

    cv::GaussianBlur(lena, blured, cv::Size(5, 5), 0, 0);
    cv::Laplacian(lena, result_1, CV_32F);
    cv::Laplacian(blured, result_2, CV_32F);

    cv::imshow("lena", lena);
    cv::imshow("result_1", result_1);
    cv::imshow("result_2", result_2);
    cv::waitKey(0);

    return;
}

原图:
【OpenCV4】拉普拉斯算子提取边缘 cv::Laplacian() 用法详解和代码示例(c++)_第2张图片
单独使用拉普拉斯算子进行边缘检测:
【OpenCV4】拉普拉斯算子提取边缘 cv::Laplacian() 用法详解和代码示例(c++)_第3张图片
先用高斯滤波,再用拉普拉斯算子进行边缘检测:
【OpenCV4】拉普拉斯算子提取边缘 cv::Laplacian() 用法详解和代码示例(c++)_第4张图片
可以看到,搭配使用后效果更佳

你可能感兴趣的:(计算机视觉,c++,计算机视觉,opencv)