【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


相关文章
|
6月前
|
算法 开发工具 计算机视觉
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
98 1
|
2月前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
571 3
|
3月前
|
存储 计算机视觉 C++
在C++中实现Armadillo库与OpenCV库之间的数据格式转换
在C++中实现Armadillo库与OpenCV库之间的数据格式转换是一项常见且实用的技能。上述步骤提供了一种标准的方法来进行这种转换,可以帮助开发者在两个库之间高效地转移和处理数据。虽然转换过程相对直接,但开发者应留意数据类型匹配和性能优化等关键细节。
69 11
|
3月前
|
存储 计算机视觉 C++
在C++中实现Armadillo库与OpenCV库之间的数据格式转换
在C++中实现Armadillo库与OpenCV库之间的数据格式转换是一项常见且实用的技能。上述步骤提供了一种标准的方法来进行这种转换,可以帮助开发者在两个库之间高效地转移和处理数据。虽然转换过程相对直接,但开发者应留意数据类型匹配和性能优化等关键细节。
34 3
|
6月前
|
算法 计算机视觉
【Qt&OpenCV 图像边缘检测 Sobel/Laplace/Canny】
【Qt&OpenCV 图像边缘检测 Sobel/Laplace/Canny】
81 0
|
2月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
576 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
3月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
56 4
|
3月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
4月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
WK
|
4月前
|
编解码 计算机视觉 Python
如何在OpenCV中进行图像转换
在OpenCV中,图像转换涉及颜色空间变换、大小调整及类型转换等操作。常用函数如`cvtColor`可实现BGR到RGB、灰度图或HSV的转换;`resize`则用于调整图像分辨率。此外,通过`astype`或`convertScaleAbs`可改变图像数据类型。对于复杂的几何变换,如仿射或透视变换,则可利用`warpAffine`和`warpPerspective`函数实现。这些技术为图像处理提供了强大的工具。
WK
132 1