OpenCV-Laplacian边缘检测

Posted 翟天保Steven

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV-Laplacian边缘检测相关的知识,希望对你有一定的参考价值。

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

函数原型

void Laplacian( InputArray src, OutputArray dst, int ddepth,
                int ksize = 1, double scale = 1, double delta = 0,
                int borderType = BORDER_DEFAULT );

参数说明

  1. InputArray类型的src,输入图像,8位图像。
  2. OutputArray类型的dst,输出图像。
  3. int类型的ddepth,输出图像的深度。若src为CV_8U,则可取-1/CV_16S/CV_32F/CV_64F;若src为CV_16U/CV_16S,可取-1/CV_32F/CV_64F;若src为CV_32F,可取-1/CV_32F/CV_64F;若src为CV_64F,可取-1/CV_64F。
  4. int类型的ksize,默认值为3,表示Sobel核的大小,取奇数。
  5. double类型的scale,计算导数值时选的缩放因子,默认为1。
  6. double类型的delta,表示在结果存入目标图之前可选的delta值,默认为0。
  7. int类型的borderType,边界模式。

函数原理

       Laplacian算子是n维欧几里德空间中的一个二阶微分算子,定义为梯度grad的散度div。因此如果f是二阶可微的实函数,则f的拉普拉斯算子定义如下:

1)f的拉普拉斯算子也是笛卡尔坐标系中的所有非混合二阶偏导数求和。

2)作为一个二阶微分算子,拉普拉斯算子把C函数映射到C函数。对于k大于等于2时,定义算子

       根据图像处理的原理可知,二阶导数可以用来进行检测边缘。因为图像是二维,需要在两个方向进行求导。使用Laplacian算子将会使求导过程变得简单。

       Laplacian算子的定义为:

测试代码

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main()
{
	// 加载图片
	Mat src = imread("test.jpg");
	if (src.empty())
	{
		cout << "picture load error!" << endl;
		return 0;
	}
	Mat blur, gray, result, abs_result;
	// 高斯滤波
	GaussianBlur(src, blur, Size(3, 3), 0, 0, BORDER_DEFAULT);
	// 转为灰度图像
	cvtColor(blur, gray, COLOR_RGB2GRAY);
	// 拉普拉斯
	Laplacian(gray, result, CV_16S, 5, 1, 0, BORDER_DEFAULT);
	// 计算绝对值
	convertScaleAbs(result, abs_result);
	// 结果显示
	imshow("src", src);
	imshow("result", abs_result);
	waitKey(0);
	return 0;
}

测试效果

图1 原图
图2 算子孔径尺寸为5时效果图
图3 算子孔径尺寸为3时效果图

       注意由于Laplacian使用了图像梯度,所以其内部代码其实调用了Sobel算子。利用Sobel算子的运算,计算出x方向和y方向的导数,进而得到载入图像的拉普拉斯变换结果。

       当尺寸为3*3时,拉普拉斯算子的模板为:

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

以上是关于OpenCV-Laplacian边缘检测的主要内容,如果未能解决你的问题,请参考以下文章

图像的亚像素边缘检测 MATLAB代码

OpenCV-Laplacian和Sobel滤波器的实现

matlab图像如何用代码完成图像的分割、边缘检测和拼接的任务?

图像边缘检测基于matlab Zernike矩亚像素边缘检测含Matlab源码 1536期

OpenCV——Sobel边缘检测

OpenCV——Canny边缘检测