Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法

【1】算法简介

       Laplacian(拉普拉斯)算子是一种二阶导数算子,其具有旋转不变性,可以满足不同方向的图像边缘锐化(边缘检测)的要求。通常情况下,其算子的系数之和需要为零。 Laplacian算子具有各方向同性的特点,能够对任意方向的边缘进行提取,具有无方向性的优点,因此使用Laplacian算子提取边缘不需要分别检测X方向的边缘和Y方向的边缘,只需要一次边缘检测即可。Laplacian算子是一种二阶导数算子,对噪声比较敏感,因此常需要配合高斯滤波一起使用。
        d3378c7ba1064b49981e661b1cbf2fa5.png 

         需要注意,在上述图像中,计算结果的值可能为正数,也可能为负数。所以,需要对计算结果取绝对值,以保证后续运算和显示都是正确的。

41f754b2f4ca4a25a6dc3dfd3a7a16d3.png

【2】算法参数

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:输出图像的数据类型(深度),根据输入图像的数据类型不同拥有不同的取值范围,具体的取值范围在表5-1给出,当赋值为-1时,输出图像的数据类型自动选择。
ksize:滤波器的大小,必须为正奇数。
scale:对导数计算结果进行缩放的缩放因子,默认系数为1,表示不进行缩放。
delta:偏值,在计算结果中加上偏值。
borderType:像素外推法选择标志,默认参数为BORDER_DEFAULT,表示不包含边界值倒序填充。

【3】完整代码

#include<opencv2\opencv.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\highgui\highgui.hpp>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	//载入原始图
	Mat src = imread("E:\\乔大花进度\\11-28\\边缘检测\\4.jpg");
	//【1】定义变量
	Mat src_gray, dst, abs_dst;
	//【2】显示原图
	imshow("原始图",src);
	//【3】使用高斯滤波消除噪声
	GaussianBlur(src,src,Size(3,3),0,0,BORDER_DEFAULT);
	//【4】转为灰度图
	cvtColor(src,src_gray,COLOR_BGR2GRAY);
	//【5】Laplacian查找边缘
	Laplacian(src_gray,dst,CV_16S,3,1,0);

	//【6】计算绝对值,并将结果转为8位
	convertScaleAbs(dst,abs_dst);

	//【7】显示效果图
	imshow("Laplacian变换",abs_dst);
	cout << "Laplacian算法输出图像的通道" << abs_dst.channels() << endl;

	waitKey(0);
	system("pause");
	destroyAllWindows();

	return 0;

}

运行结果:
31488877edcb449396658860942de52b.png

猜你喜欢

转载自blog.csdn.net/qiaodahua/article/details/128083612