图像处理之Laplacian算子

1,019 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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.png

需要说明的是,由于Laplacian使用了图像梯度,它内部的代码其实是调用Sobel算子的。

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)如下:

3.png

而当ksize=1时,Laplacian10函数采用以下3x3的孔径:

4.png

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; 
}

效果图:

0.png