【1】算法简介
Laplacian(拉普拉斯)算子是一种二阶导数算子,其具有旋转不变性,可以满足不同方向的图像边缘锐化(边缘检测)的要求。通常情况下,其算子的系数之和需要为零。 Laplacian算子具有各方向同性的特点,能够对任意方向的边缘进行提取,具有无方向性的优点,因此使用Laplacian算子提取边缘不需要分别检测X方向的边缘和Y方向的边缘,只需要一次边缘检测即可。Laplacian算子是一种二阶导数算子,对噪声比较敏感,因此常需要配合高斯滤波一起使用。
需要注意,在上述图像中,计算结果的值可能为正数,也可能为负数。所以,需要对计算结果取绝对值,以保证后续运算和显示都是正确的。
【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; }
运行结果: