opencv学习笔记(十九)图像边缘提取-Laplance算子

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

5.运行结果

发布了53 篇原创文章 · 获赞 9 · 访问量 3282

猜你喜欢

转载自blog.csdn.net/weixin_41039168/article/details/96422822
今日推荐