开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第25天
1 Laplacian 算子简介
Laplacian算子是n维欧几里德空间中的一个二阶微分算子,定义为梯度grad的散度div。因此如果f是二阶可微的实函数,则f的拉普拉斯算子定义如下。
(1)f的拉普拉斯算子也是笛卡儿坐标系xi中的所有非混合二阶偏导数求和。
(2)作为一个二阶微分算子,拉普拉斯算子把C函数映射到C函数。对于k≥2,表达式(1)(或(2))定义了一个算子Δ:C(R)→C(R);或更一般地,对于任何开集Ω,定义了一个算子Δ:C(Ω)→C(Ω)。
根据图像处理的原理可知,二阶导数可以用来进行检测边缘。因为图像“二维”,需要在两个方向进行求导。使用Laplacian 算子将会使求导过程变简单。
Laplacian算子的定义:
2 计算拉普拉斯变换:Laplacian()函数
Laplacian 函数可以计算出图像经过拉普拉斯变换后的结果。
C++:
void Laplacian(InputArray src, OutputArray dst, int ddepth, int ksize=1, double scale = 1,
double delta = 0, int borderType = BORDER_DEFAULT);
- 第一个参数,InputArray类型的image,输入图像,即源图像,填Mat类的对象即可,且需为单通道8位图像。
- 第二个参数,OutputArray 类型的edges,输出的边缘图,需要和源图片有一样的尺寸和通道数。
- 第三个参数,int类型的ddept,目标图像的深度。
- 第四个参数,int类型的ksize,用于计算二阶导数的滤波器的孔径尺寸,大小必须为正奇数,且有默认值1。
- 第五个参数,double类型的scale,计算拉普拉斯值的时候可选的比例因子,有默认值1。
- 第六个参数,double类型的delta,表示在结果存入目标图(第二个参数dst)之前可选的delta值,有默认值0。
- 第七个参数,int 类型的 borderType,边界模式,默认值为BORDER DEFAULT。这个参数可以在官方文档中borderInterpolate()处得到更详细的 信息。
Laplacian()函数其实主要是利用 sobel算子的运算。它通过加上sobel算子运算出的图像x方向和y方向上的导数,来得到载入图像的拉普拉斯变换结果。
其中,sobel算子(ksize>1)如下:
而当ksize=1时,Laplacian10函数采用以下3x3的孔径:
3 示例
代码:
//---------------------------------【头文件、命名空间包含部分】----------------------------
// 描述:包含程序所使用的头文件和命名空间
//---------------------------------------------------------------------------------------
#include <opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
//-----------------------------------【main( )函数】--------------------------------------------
// 描述:控制台应用程序的入口函数,我们的程序从这里开始
//---------------------------------------------------------------------------------------------
int main( )
{
//【0】变量的定义
Mat src,src_gray,dst, abs_dst;
//【1】载入原始图
src = imread("1.jpg"); //工程目录下应该有一张名为1.jpg的素材图
//【2】显示原始图
imshow("【原始图】图像Laplace变换", src);
//【3】使用高斯滤波消除噪声
GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );
//【4】转换为灰度图
cvtColor( src, src_gray, CV_RGB2GRAY );
//【5】使用Laplace函数
Laplacian( src_gray, dst, CV_16S, 3, 1, 0, BORDER_DEFAULT );
//【6】计算绝对值,并将结果转换成8位
convertScaleAbs( dst, abs_dst );
//【7】显示效果图
imshow( "【效果图】图像Laplace变换", abs_dst );
waitKey(0);
return 0;
}
效果图: