1 //-----------------------------------【头文件包含部分】---------------------------------------
2 // 描述:包含程序所依赖的头文件
3 //----------------------------------------------------------------------------------------------
4 #include <opencv2/opencv.hpp>
5 #include<opencv2/highgui/highgui.hpp>
6 #include<opencv2/imgproc/imgproc.hpp>
7
8 //-----------------------------------【命名空间声明部分】---------------------------------------
9 // 描述:包含程序所使用的命名空间
10 //-----------------------------------------------------------------------------------------------
11 using namespace cv;
12
13
14 //-----------------------------------【main( )函数】--------------------------------------------
15 // 描述:控制台应用程序的入口函数,我们的程序从这里开始
16 //-----------------------------------------------------------------------------------------------
17 int main( )
18 {
19 //【0】变量的定义
20 Mat src,src_gray,dst, abs_dst;
21
22 //【1】载入原始图
23 src = imread("1.jpg"); //工程目录下应该有一张名为1.jpg的素材图
24
25 //【2】显示原始图
26 imshow("【原始图】图像Laplace变换", src);
27
28 //【3】使用高斯滤波消除噪声
29 GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );
30
31 //【4】转换为灰度图
32 cvtColor( src, src_gray, CV_RGB2GRAY );
33
34 //【5】使用Laplace函数
35 Laplacian( src_gray, dst, CV_16S, 3, 1, 0, BORDER_DEFAULT );
36
37 //【6】计算绝对值,并将结果转换成8位
38 convertScaleAbs( dst, abs_dst );
39
40 //【7】显示效果图
41 imshow( "【效果图】图像Laplace变换", abs_dst );
42
43 waitKey(0);
44
45 return 0;
46 }
Laplacian 算子是n维欧几里德空间中的一个二阶微分算子,定义为梯度grad()的散度div()。因此如果f是二阶可微的实函数,则f的拉普拉斯算子定义为:
(1) f的拉普拉斯算子也是笛卡儿坐标系xi中的所有非混合二阶偏导数求和。
(2) 作为一个二阶微分算子,拉普拉斯算子把C函数映射到C函数,对于k ≥ 2。表达式(1)(或(2))定义了一个算子Δ :C(R) → C(R),或更一般地,定义了一个算子Δ : C(Ω) → C(Ω),对于任何开集Ω。
根据图像处理的原理我们知道,二阶导数可以用来进行检测边缘。因为图像是“二维”, 我们需要在两个方向进行求导。使用Laplacian算子将会使求导过程变得简单。
Laplacian 算子的定义:
需要点破的是,由于 Laplacian使用了图像梯度,它内部的代码其实是调用了 Sobel 算子的。
另附一个小tips:让一幅图像减去它的Laplacian可以增强对比度。
原始图像:
边缘检测图像: