上述的边缘检测算子都具有方向性,因此需要分别求取X方向的边缘和Y方向的边缘,之后将两个方向的边缘综合得到图像的整体边缘。Laplacian算子具有各方向同性的特点,能够对任意方向的边缘进行提取,具有无方向性的优点,因此使用Laplacian算子提取边缘不需要分别检测X方向的边缘和Y方向的边缘,只需要一次边缘检测即可。Laplacian算子是一种二阶导数算子,对噪声比较敏感,因此常需要配合高斯滤波一起使用。

Laplacian算子的定义如式(5.20)所示。

【从零学习OpenCV 4】Laplacian算子_Laplacian算子

OpenCV 4提供了通过Laplacian算子提取图像边缘的Laplacian()函数,该函数的函数原型在代码清单5-30中给出。

代码清单5-30 Laplacian()函数原型
1. void cv::Laplacian(InputArray src,
2. OutputArray dst,
3. int ddepth,
4. int ksize = 1,
5. double scale = 1,
6. double delta = 0,
7. int borderType = BORDER_DEFAULT
8. )
  • src:输入原图像,可以是灰度图像或彩色图像。
  • dst:输出图像,与输入图像src具有相同的尺寸和通道数
  • ddepth:输出图像的数据类型(深度),根据输入图像的数据类型不同拥有不同的取值范围,具体的取值范围在表5-1给出,当赋值为-1时,输出图像的数据类型自动选择。
  • ksize:滤波器的大小,必须为正奇数。
  • scale:对导数计算结果进行缩放的缩放因子,默认系数为1,表示不进行缩放。
  • delta:偏值,在计算结果中加上偏值。
  • borderType:像素外推法选择标志,取值范围在表3-5中给出,默认参数为BORDER_DEFAULT,表示不包含边界值倒序填充。

该函数利用Laplacian算子提取图像中的边缘信息,与Soble()函数相同,函数的前两个参数分别为输入图像和输出图像,第三个参数为输出图像的数据类型,这里需要注意由于提取边缘信息时有可能会出现负数,因此不要使用CV_8U数据类型的输出图像,否则会使得图像边缘提取不准确。函数第四个参数是滤波器尺寸的大小,必须是正奇数,当该参数的值大于1时,该函数通过Sobel算子计算出图像X方向和Y方向的二阶导数,将两个方向的导数求和得到Laplacian算子,其计算公式如式(5.21)所示。

【从零学习OpenCV 4】Laplacian算子_Laplacian算子_02

当第四个参数等于1时, Laplacian算子如式(5.22)所示。

函数最后两个参数为图像缩放因子和图像外推填充方法的标志,多数情况下并不需要设置,只需要采用默认参数即可。

为了更好的理解Laplacian ()函数的使用方法,在代码清单5-31中给出了利用Laplacian ()函数检测图像边缘的示例程序。由于Laplacian算子对图像中的噪声较为敏感,因此程序中使用Laplacian算子分别对高斯滤波后的图像和未高斯滤波的图像进行边缘检测,检测结果在图5-34中给出。通过结果可以发现,图像去除噪声后通过Laplacian算子提取边缘变得更加准确。

代码清单5-31 myLaplacian.cpp利用Laplacian算子检测图像边缘
1. #include <opencv2\opencv.hpp>
2. #include <iostream>
3.

4. using namespace cv;
5. using namespace std;
6.

7. int main()
8. {
9. //读取图像,黑白图像边缘检测结果较为明显
10. Mat img = imread("equalLena.png", IMREAD_ANYDEPTH);
11. if (img.empty())
12. {
13. cout << "请确认图像文件名称是否正确" << endl;
14. return -1;
15. }
16. Mat result, result_g, result_G;
17.

18. //未滤波提取边缘
19. Laplacian(img, result, CV_16S, 3, 1, 0);
20. convertScaleAbs(result, result);
21.

22. //滤波后提取Laplacian边缘
23. GaussianBlur(img, result_g, Size(3, 3), 5, 0); //高斯滤波
24. Laplacian(result_g, result_G, CV_16S, 3, 1, 0);
25. convertScaleAbs(result_G, result_G);
26.

27. //显示图像
28. imshow("result", result);
29. imshow("result_G", result_G);
30. waitKey(0);
31. return 0;
32. }
【从零学习OpenCV 4】Laplacian算子_Laplacian算子_03
图5-34 myLaplacian.cpp程序中图像提取边缘结果
从零学习OpenCV 4往期推荐

【从零学习OpenCV 4】Windows系统中安装OpenCV 4

【从零学习OpenCV 4】Ubuntu系统中安装OpenCV 4

【从零学习OpenCV 4】opencv_contrib扩展模块的安装

【从零学习OpenCV 4】Mat类介绍

【从零学习OpenCV 4】Mat类构造与赋值

【从零学习OpenCV 4】Mat类支持的运算

【从零学习OpenCV 4】这4种读取Mat类元素的的方法你都知道么?

【从零学习OpenCV 4】namedWindow函数&imshow函数的使用

【从零学习OpenCV 4】颜色模型与转换

【从零学习OpenCV 4】多通道分离与合并

【从零学习OpenCV 4】图像像素统计

【从零学习OpenCV 4】两图像间的像素操作

【从零学习OpenCV 4】图像二值化

【从零学习OpenCV 4】LUT查找表

【从零学习OpenCV 4】图像仿射变换

【从零学习OpenCV 4】图像透视变换

【从零学习OpenCV 4】极坐标变换

【从零学习OpenCV 4】绘制几何图形

【从零学习OpenCV 4】图像金字塔

【从零学习OpenCV 4】创建图像窗口滑动条

【从零学习OpenCV 4】鼠标响应

【从零学习OpenCV 4】图像直方图绘制

【从零学习OpenCV 4】直方图归一化

【从零学习OpenCV 4】直方图比较

【从零学习OpenCV 4】直方图均衡化

【从零学习OpenCV 4】直方图匹配

【从零学习OpenCV 4】图像卷积

【从零学习OpenCV 4】图像中添加椒盐噪声

【从零学习OpenCV 4】图像中添加高斯噪声

【从零学习OpenCV 4】均值滤波

【从零学习OpenCV 4】方框滤波

【从零学习OpenCV 4】高斯滤波

【从零学习OpenCV 4】双边滤波

【从零学习OpenCV 4】边缘检测原理

【从零学习OpenCV 4】Sobel算子  ……


【从零学习OpenCV 4】Laplacian算子_Laplacian算子_04