1.基本理论
在二阶导数的时候,最大变化处的值为零即边缘是零值。通过二阶导数计算,依据此理论我们可以计算图像二阶导数,提取边缘。
2.矩阵算子和处理流程
(1)Laplance算子如下:
(2)处理流程如下:
高斯模糊 – 去噪声GaussianBlur()
转换为灰度图像cvtColor()
拉普拉斯 – 二阶导数计算Laplacian()
取绝对值convertScaleAbs()
3.API介绍
Laplacian(InputArray src,OutputArray dst,int depth,int kisze, double scale = 1,double delta =0.0,int borderType = 4)
参数1,2:输入与输出图像
参数3:图像深度,一般取CV_16S
参数4:内核大小(3*3即为上面的算子)
参数5:计算导数值的可选比例因子; 默认情况下,不应用缩放
参数6:在将结果存储在dst之前添加到结果中的可选delta值
参数7:像素外推方法
参数5-7一般用默认。
4.代码实现
#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;
char inputName[] = "input name";
char outputName[] = "output name";
int main()
{
Mat src, dst;
src = imread("D:/demo.jpg");
if (src.empty())
{
cout << "找不到图像" << endl;
return -1;
}
namedWindow(inputName, CV_WINDOW_AUTOSIZE);
imshow(inputName, src);
namedWindow(outputName, CV_WINDOW_AUTOSIZE);
//第一步高斯模糊
GaussianBlur(src, dst, Size(3, 3), 0.0, 0.0);
//第二步转灰度
Mat srcGray;
cvtColor(dst,srcGray, CV_BGR2GRAY);
//第三步laplance
Mat result;
Laplacian(srcGray, result, CV_16S, 3);
convertScaleAbs(result, result);
threshold(result, result, 0, 255, THRESH_OTSU | THRESH_BINARY);//阈值类型自己判断,提升图像黑白对比度
imshow(outputName, result);
waitKey(0);
return 0;
}