opencv c++函数 imgproc模块 9 Laplace 算子

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

目标

本文档尝试解答如下问题:

  • 如何使用OpenCV函数 Laplacian 实现 Laplacian 算子 的离散模拟。

原理

  1. 前一节我们学习了 Sobel 算子 ,其基础来自于一个事实,即在边缘部分,像素值出现”跳跃“或者较大的变化。如果在此边缘部分求取一阶导数,你会看到极值的出现。正如下图所示:

    Previous theory
  2. 如果在边缘部分求二阶导数会出现什么情况?

    Second derivative

    你会发现在一阶导数的极值位置,二阶导数为0。所以我们也可以用这个特点来作为检测图像边缘的方法。 但是, 二阶导数的0值不仅仅出现在边缘(它们也可能出现在无意义的位置),但是我们可以过滤掉这些点。

Laplacian 算子

  1. 从以上分析中,我们推论二阶导数可以用来 检测边缘 。 因为图像是 “2维”, 我们需要在两个方向求导。使用Laplacian算子将会使求导过程变得简单。
  2. Laplacian 算子 的定义:

Laplace(f) = \dfrac{\partial^{2} f}{\partial x^{2}} + \dfrac{\partial^{2} f}{\partial y^{2}}

  1. OpenCV函数 Laplacian 实现了Laplacian算子。 实际上,由于 Laplacian使用了图像梯度,它内部调用了 Sobel 算子。

源码

  1. 本程序做什么?
    • 装载图像
    • 使用高斯平滑消除噪声, 将图像转换到灰度空间。
    • 使用Laplacian算子作用于灰度图像,并保存输出图像。
    • 输出结果。
  2. 下面是本教程的源码,你也可以从 这里 下载。
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>

using namespace cv;

/** @函数 main */
int main( int argc, char** argv )
{
  Mat src, src_gray, dst;
  int kernel_size = 3;
  int scale = 1;
  int delta = 0;
  int ddepth = CV_16S;
  char* window_name = "Laplace Demo";

  int c;

  /// 装载图像
  src = imread( argv[1] );

  if( !src.data )
    { return -1; }

  /// 使用高斯滤波消除噪声
  GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );

  /// 转换为灰度图
  cvtColor( src, src_gray, CV_RGB2GRAY );

  /// 创建显示窗口
  namedWindow( window_name, CV_WINDOW_AUTOSIZE );

  /// 使用Laplace函数
  Mat abs_dst;

  Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT );
  convertScaleAbs( dst, abs_dst );

  /// 显示结果
  imshow( window_name, abs_dst );

  waitKey(0);

  return 0;
  }

解释

  1. 首先申明变量:

    Mat src, src_gray, dst;
    int kernel_size = 3;
    int scale = 1;
    int delta = 0;
    int ddepth = CV_16S;
    char* window_name = "Laplace Demo";
    
  2. 装载原图像:

    src = imread( argv[1] );
    
    if( !src.data )
      { return -1; }
    
  3. 高斯平滑降噪:

    GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );
    
  4. 使用 cvtColor 转换为灰度图

    cvtColor( src, src_gray, CV_RGB2GRAY );
    

#.对灰度图使用Laplacian算子:

Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT );

函数接受了以下参数:

  • src_gray: 输入图像。
  • dst: 输出图像
  • ddepth: 输出图像的深度。 因为输入图像的深度是 CV_8U ,这里我们必须定义 ddepth = CV_16S 以避免外溢。
  • kernel_size: 内部调用的 Sobel算子的内核大小,此例中设置为3。
  • scaledelta 和 BORDER_DEFAULT: 使用默认值。
  1. 将输出图像的深度转化为 CV_8U :

    convertScaleAbs( dst, abs_dst );
    
  2. 显示结果:

    imshow( window_name, abs_dst );
    

结果

#.在编译上面的代码之后, 我们可以运行结果,将图片路径输入,如下图:

Original test image
  1. 我们得到下图所示的结果。 注意观察树木和牛的轮廓基本上很好的反映出来(除了像素值比较接近的地方, 比如奶牛的头部)。 此外,注意树木(右方)后面的房子屋顶被明显的加强显示出来,这是由于局部对比度比较强的原因。

    Original test image
OpenCV之拉普拉斯算子:Laplacian()函数 根据图像处理的原理,二阶导数可以用来进行边缘检测,因为图像是二维的,需要在两个方向上求导,使用Laplacian算子将会使求导过程变得简单。 Laplacian算子的定义: 需要说明的是,由于Laplacian算子使用了图像梯度,它内部的代码其实是调用了Sobel算子的。 让一幅图像减去它的Laplacian算子可以增强它的对比度。 Laplacian()函数 函数原型: void Laplacian(InputArray src, outputArray dst, int ddepth, 阅读详情

相关推荐

Laplace(拉普拉斯)算子

目录原理 原理 Laplace算子作为边缘检测之一,和Sobel算子一样也是工程数学中常用的一种积分变换,属于空间锐化滤波操作。拉普拉斯算子Laplace Operator)是n维欧几里德空间中的一个二阶微分算子,定义为梯度(▽f)的散度(▽·f)。 拉普拉斯算子是二阶微分线性算子,在图像边缘处理中,二阶微分的边缘定位能力更强,锐化效果更好,因此在进行图像边缘处理时,直接采用二阶微分算子而不使用一阶微分。 图1 一阶微分和二阶微分计算图 离散函数的导数退化成了差分,一维一阶差分公式和二阶差分公式分别为:

Sagacity_1125的博客 2万+

Opencv之图像边缘检测:3.Laplacian算子(cv2.Laplacian)

Laplacian(拉普拉斯)算子是一种二阶导数算子,其具有旋转不变性,可以满足不同 方向的图像边缘锐化(边缘检测)的要求。

qq_49478668的博客 2万+

OpenCV里实现Laplacian算子

拉普拉斯算子是一个二阶导数计算边缘的方式,可以由下面的过程来推导出来,首先来看在微积分中,一维函数的一阶微分的基本定义是这样的: 而图像是一个二维函数f(x,y),其微分当然就是偏微分。因此有: 因为图像是一个离散的二维函数,ϵ不能无限小,我们的图像是按照像素来离散的,最小的ϵ就是1像素。因此,上面的图像微分又变成了如下的形式(ϵ=1): 因此二阶求导,就可以写成这样: 上...

大坡3D软件开发 811

利用OpenCV函数Laplacian()[拉普拉斯算子]实现图像的边缘检测

拉普拉斯算子是最简单的各向同的性二阶微分算子,具有旋转不变性。根据函数微分特性,该像素点值的二阶微分为零的点为边缘点。这样就实现了边缘检测。利用拉普拉斯算子作边缘检测前最好先对图像作一个高斯滤波(高斯滤波见博文http://blog.csdn.net/wenhao_ir/article/details/51699064),效果会好不少。 为什么效果会好不少? 边缘检测的算法主要是基于图像强度的一阶和二阶微分操作,但导数通常对噪声很敏感,所以边缘检测算法常常需要根据图像源的数据进行预处理操作,因此采用滤波

昊虹AI笔记 7274

opencv:边缘检测之Laplacian算子思想及实现

Laplacian算子边缘检测的来源 在边缘部分求取一阶导数,你会看到极值的出现: 如果在边缘部分求二阶导数会出现什么情况? 从上例中我们可以推论检测边缘可以通过定位梯度值大于邻域的相素的方法找到(或者推广到大 于一个阀值). 从以上分析中,我们推论二阶导数可以用来检测边缘 。 因为图像是 “2维”, 我们需要在两个方向求导。使用Laplacian算子将会使求导过程变得简单。 Laplacian定义: 代码实现: import cv2 import numpy as np img=cv2.im

瞳瞳瞳呀 1439

使用函数cv2.Laplacian()计算图像的边缘信息,opencv的Python实现

import cv2 img = cv2.imread('../data/ren.png') laplacian = cv2.Laplacian(img, cv2.CV_64F) laplacian = cv2.convertScaleAbs(laplacian) cv2.imshow('laplacian', laplacian) cv2.waitKey() cv2.destroyAllW...

my_name_is_learn的博客 3559

5.4.4 边缘检测-拉普拉斯算子

拉普拉斯算子是一个二阶边缘算子,即梯度的散度。拉普拉斯算子的实现也是通过模板实现。常用的拉普拉斯模板定义如下:                                                             拉普拉斯算子计算图像的二阶导数,对于图像噪声比较敏感。拉普拉斯算子的结果为标量,表示边缘的宽度。但是它常产生双像素宽边缘,而且不能提供方向信息,因此较少直接用于边缘...

kateyabc的博客 8479

opencv 笔记17 Imgproc_Lapacian

#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include #include using namespace cv; /** @函数 main */ int main( int argc, char** argv ) { Mat src, src_gray, dst;

fengcs的专栏 758

pytorch使用sobel、laplace算子

在torch.nn.functional.conv2d()中使用自己构造的sobel卷积核,卷积核shape为(out_channels, in_channels, kernel_size, kernel_size) import torch, cv2 import torch.nn.functional as F sobel_x = torch.tensor([[-1, -2, -1], [0, 0, 0], .

如人饮水、冷暖自知 7759

三种边缘检测算子及各自优劣

转载于边缘检测算法各自优缺点 边缘提取其实也是一种滤波,不同的算子有不同的提取效果。比较常用的方法有三种,Sobel算子,Laplacian算子,Canny算子。 Sobel算子检测方法对灰度渐变和噪声较多的图像处理效果较好,sobel算子对边缘定位不是很准确,图像的边缘不止一个像素;当对精度要求不是很高时,是一种较为常用的边缘检测方法。 Canny方法不容易受噪声干扰,能够检测到真正的弱边缘。优点在于,使用两种不同的阈值分别检测强边缘和弱边缘,并且当弱边缘和强边缘相连时,才将弱边缘包含在输出图像中。 La

roymustang的博客 2万+

基于c语言图像边缘检测的程序,图像边缘检测之拉普拉斯(Laplacian)C++实现

拉普拉斯算子(Laplacian)可应用到图像边缘检测中。在OpenCV中当kernel大小为3*3时,支持两种kernel算子,分别为:在OpenCV中默认的计算方式如下,假设有一个5*5的小图像,原始值依次为1,2,…25,如下图红色部分,首先将5*5映射到(5+3-1)*(5+3-1)大小,然后和3*3的kernel做累积和,因为计算结果有可能超出有效值[0, 255]范围,因此在最终还需要...

weixin_39519798的博客 1263

图像处理5:Laplace增强算子法(C++

Laplace增强算子Laplace算子是线性二阶微分算子 对于离散的图像而言,二阶偏导数可用二阶差分近似 Laplace增强: void CMFCworkDlg::OnBnClickedButton5() { // TODO: 在此添加控件通知处理程序代码 //laplace增强 Mat image = imread("ema.jpg", 1); Mat image_gray = gray_img(image); Mat result, laplaceimg; result.

weixin_37707670的博客 1723

OpenCV-跟我一起学数字图像处理之拉普拉斯算子

Laplace算子和Sobel算子一样,属于空间锐化滤波操作。起本质与前面的Spatial Filter操作大同小异,下面就通过Laplace算子来介绍一下空间锐化滤波,并对OpenCV中提供的Laplacian函数进行一些说明。 数学原理 离散函数导数 离散函数的导数退化成了差分,一维一阶差分公式和二阶差分公式分别为, Laplace算子的差分形式 分别...

weixin_30721077的博客 1565

图像处理算法基础(五)---拉普拉斯变换自实现与opencv对比

最近做了几个平滑锐化的程序效果都是比opencv差一些,猜测opencv应该加了一些效果优化。 拉普拉斯算子是n维欧几里德空间中的一个二阶微分算子,定义为梯度(▽f)的散度(▽·f)。因此如果f是二阶可微的实函数,则f的拉普拉斯算子定义为: f的拉普拉斯算子也是笛卡儿坐标系xi中的所有非混合二阶偏导数: 作为一个二阶微分算子,拉普拉斯算子把C函数映射到C函数,对于k≥ 2

liu_xiao_cheng的专栏 8079

Opencv Laplacian算子

Laplacian算子

u012474716的博客 2673

Opencv中的Laplacian(拉普拉斯算法)

void cv::Laplacian( InputArray _src, OutputArray _dst, int ddepth, int ksize, double scale, double delta, int borderType ) { Mat src = _src.getMat(); if (ddepth &amp;amp;amp;lt; 0) ...

阿桑的专栏 7540

OpenCV-Python教程(7、Laplacian算子

本篇文章介绍如何用OpenCV-Python来使用Laplacian算子。 提示: 转载请详细注明原作者及出处,谢谢! 本文介绍使用在OpenCV-Python中使用Laplacian函数本文不介详细的理论知识,读者可从其他资料中获取相应的背景知识。笔者推荐清华大学出版社的《图像处理与计算机视觉算法及应用(第2版) 》。 Laplacian算子 图像中的边缘区域,像素值会

sunny2038的专栏 6万+

图像拉普拉斯算子

一、拉普拉斯算子原理 拉普拉斯算子是最简单的各向同性微分算子,具有旋转不变性。一个二维图像函数的拉普拉斯变换是各向同性的二阶导数,定义为: 为了更适合于数字图像处理,将该方程表示为离散形式:    另外,拉普拉斯算子还可以表示成模板的形式,如图5-9所示。图5-9(a)表示离散拉普拉斯算子的模板,图5-9(b)表示其扩展模板,图5-9(c)则分别表示其他两种拉普拉斯的实现模板。从模

2万+

Laplace(拉普拉斯)算子 和 高斯拉普拉斯算子(Laplacian of Gaussian, LoG)

Laplace算子作为边缘检测之一,和Sobel算子一样也是工程数学中常用的一种积分变换,属于空间锐化滤波操作。拉普拉斯算子Laplace Operator)是n维欧几里德空间中的一个二阶微分算子,定义为梯度(▽f)的散度(▽·f)。拉普拉斯算子是二阶微分线性算子,在图像边缘处理中,二阶微分的边缘定位能力更强,锐化效果更好,因此在进行图像边缘处理时,直接采用二阶微分算子而不使用一阶微分。

mjiansun的专栏 1万+
上一篇: opencv c++函数 imgproc模块 8 Sobel 导数
下一篇: opencv c++函数 imgproc模块 10 Canny 边缘检测
淡淡的生活
博客等级 码龄16年 341粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值