【OpenCv • c++】基础边缘检测算子 —— Laplace

简介: 【OpenCv • c++】基础边缘检测算子 —— Laplace

什么是边缘检测


      边缘检测是图像处理与计算机视觉中最重要的技术之一,其目的是检测识别出图像中亮度变化剧烈的像素点构成的集合。图像边缘的正确检测对于分析图像中的内容、实现图像中物体的分割、定位等具有重要的作用。边缘检测大大减少了源图像的数据量,剔除了与目标不相干的信息,保留了图像重要的结构属性。


      边缘检测算子是利用图像边缘的突变性质来检测边缘的,通常情况下边缘检测有以下三种类型。


一阶微分:以一阶微分为基础的边缘检测,通过计算图像的梯度值来检测图像边缘,如Sobel算子,Prewitt算子,Roberts算子及差分边缘检测。


二阶微分:以二阶微分为基础的边缘检测,通过寻求二阶导数中的过零点来检测边缘,如拉普拉斯算子,高拉普拉斯算子,Canny算子边缘检测。


混合一阶微分和二阶微分:以混合一阶微分和二阶微分为基础的边缘检测,综合利用一阶微分和二阶微分的特征,如Marr-Hildreth边缘检测算子。


什么是 Laplace 算子


Q:什么是Laplace 算子?

A:Laplace 算子是最简单的各向同性二阶微分算子,具有旋转不变性,根据函数微分特性,该像素点值的二阶微分为零的点为边缘点。对于图像中灰度变化剧烈的区域,拉普拉斯算子能实现其边缘检测。拉普拉斯算子利用二阶微分特性与峰值间的过零点来确定边缘的位置,对奇异点或者边界点更为敏感,因此常用于图像锐化处理中。

 图像的锐化操作的主要目的是突出图像的细节或者增强被模糊的图像细节,可实现灰度反差增强,同时使图像变得清晰。微分运算可以实现图像细节的突出,积分运算或加权平均可使图像变模糊。

 对于原始图像f(x,y),锐化操作可以通过拉普拉斯算子对源图像进行处理,进行微分运算操作后产生描述灰度突变的图像,再将拉普拉斯图像与原始图像叠加进而产生锐化图像。

 拉普拉斯边缘检测算子和 Sobel 算子 Prewitt 算子不同,没有对图像进行平滑处理,所以会对噪声产生较大的相应,会将噪声作为边缘,得不到有方向的边缘,由于拉普拉斯算子只有一个卷聚合,所以计算成本比其他算子要低很多。


参考代码


对于拉普拉斯边缘检测算子,OpenCV提供了库函数:

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

其中,src代表输入图像,dst表示输出图像,ddepth代表输出图像的数据类型(位深),ksize代表拉普拉斯核的类型,scale代表比例系数,delta代表平移系数,borderType代表边界扩充类型。

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/types_c.h>
#include<opencv2/imgproc.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
  cv::Mat srcImage = cv::imread("C:\\Users\\86173\\Desktop\\cc.png");
  if (!srcImage.data)
    return 1;
  cv::imshow("原图", srcImage);
  cv::Mat resultImage;
  //高斯平滑
  cv::GaussianBlur(srcImage, srcImage, cv::Size(3, 3), 0, 0, cv::BORDER_DEFAULT);
  //拉普拉斯变换
  cv::Laplacian(srcImage, resultImage, CV_16S, 3);
  cv::convertScaleAbs(resultImage, resultImage);
  cv::imshow("拉普拉斯", resultImage);
  cv::waitKey();
  return 0;
}

a36005749373ec4de71616592c248514_c436fdfa9fdd4c01a887f2b2a2c2f650.png


相关文章
|
7月前
|
并行计算 算法 数据可视化
基于OpenCV C++实现的光流法目标检测
基于OpenCV C++实现的光流法目标检测
|
算法 开发工具 计算机视觉
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
460 1
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
3150 3
|
存储 计算机视觉 C++
在C++中实现Armadillo库与OpenCV库之间的数据格式转换
在C++中实现Armadillo库与OpenCV库之间的数据格式转换是一项常见且实用的技能。上述步骤提供了一种标准的方法来进行这种转换,可以帮助开发者在两个库之间高效地转移和处理数据。虽然转换过程相对直接,但开发者应留意数据类型匹配和性能优化等关键细节。
265 12
|
存储 计算机视觉 C++
在C++中实现Armadillo库与OpenCV库之间的数据格式转换
在C++中实现Armadillo库与OpenCV库之间的数据格式转换是一项常见且实用的技能。上述步骤提供了一种标准的方法来进行这种转换,可以帮助开发者在两个库之间高效地转移和处理数据。虽然转换过程相对直接,但开发者应留意数据类型匹配和性能优化等关键细节。
202 3
|
算法 计算机视觉
【Qt&OpenCV 图像边缘检测 Sobel/Laplace/Canny】
【Qt&OpenCV 图像边缘检测 Sobel/Laplace/Canny】
373 0
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
515 12
|
11月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
275 0
|
11月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
437 0