图像变换(3):基于OpenCV的边缘检测
四;Laplacian算子
1. Laplacian算子简介
2.计算拉普拉斯变换: Laplacian()函数
3.示例程序: Laplacian算子的使用
四;Laplacian算子
1. Laplacian算子简介
Laplacian算子是n维欧几里德空间中的一个二阶微分算子,定义为梯度grad的散度div。因此如果f是二阶可微的实函数,则f的拉普拉斯算子定义如下。
(1)f的拉普拉斯算子也是笛卡儿坐标系xi中的所有非混合二阶偏导数求和。
(2)作为一个二阶微分算子,拉普拉斯算子把C函数映射到C函数。对于k≥2,表达式(1)(或(2))定义了一个算子A:C(R)→C(R);或更一般地,对于任何开集Q,定义了一个算子A:。
根据图像处理的原理可知,二阶导数可以用来进行检测边缘。因为图像是“二维”,需要在两个方向进行求导。使用Laplacian算子将会使求导过程变得简单。
Laplacian算子的定义:
2.计算拉普拉斯变换: Laplacian()函数
Laplacian函数可以计算出图像经过拉普拉斯变换后的结果。
·第一个参数,InputArray类型的image,输入图像,即源图像,填Mat类的对象即可,且需为单通道8位图像。
·第二个参数,OutputArray类型的edges,输出的边缘图,需要和源图片有一样的尺寸和通道数。
·第三个参数,int类型的ddept,目标图像的深度。
·第四个参数,int类型的ksize,用于计算二阶导数的滤波器的孔径尺寸,大小必须为正奇数,且有默认值1。
·第五个参数,double类型的scale,计算拉普拉斯值的时候可选的比例因子,有默认值1。
·第六个参数,double类型的delta,表示在结果存入目标图(第二个参数dst)之前可选的delta值,有默认值0。
·第七个参数,int类型的 borderType,边界模式,默认值为BORDERDEFAULT。这个参数可以在官方文档中 borderInterpolate()处得到更详细的信息。
Laplacian()函数其实主要是利用sobel算子的运算。它通过加上 sobel算子运算出的图像x方向和y方向上的导数,来得到载入图像的拉普拉斯变换结果。
其中,sobel 算子(ksize>1)如下:
3.示例程序: Laplacian算子的使用
代码:
#include<opencv2/opencv.hpp>
#include <opencv2/core/utils/logger.hpp>
#include<iostream>
using namespace std;
using namespace cv;//包含cv命名空间
int main()
{
cv::utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);//控制台不在输出日志文件
Mat src, src_gray, dst, abs_dst;
//载入原始图
src = imread("E:/pictures/2.jpg");
//显示原始图
imshow("【原始图】图像Laplace变换",src);
//使用高斯滤波消除噪声
GaussianBlur(src,src,Size(3,3),0,0,BORDER_DEFAULT);
//转换为灰度图
cvtColor(src, src_gray, COLOR_RGB2GRAY);
//使用Laplace函数
Laplacian(src_gray,dst,CV_16S,3,1,0, BORDER_DEFAULT);
//计算绝对值,并将结果转换成8位
convertScaleAbs(dst,abs_dst);
//显示效果图
imshow("【效果图】图像Laplace变换",abs_dst);
waitKey(0);
return 0;
}
运行结果: