当前位置: 首页 > news >正文

【OpenCV C++20 学习笔记】拉普拉斯(Laplace)二阶求导-边缘检测

拉普拉斯二阶求导

  • 原理
    • 拉普拉斯算子(Laplacian Operator)
  • API
  • 实例

原理

在OpenCV中,Sobel算法可以对图片中的值求一阶导数,从而计算出图片中的边缘线。其原理如下面的示意图:
Sobel求导示意图
那么,如果再求一次导数的,即求二阶导数,其实也可以找出这个颜色值显著变化的分界点:
Laplace二阶求导示意图
可以看到,现在颜色值显著变化的位置,其导数值为0.
但是这有一个问题,就是二阶导数为0的也可以是一些无意义的值。所以,必须要进行一些过滤。

拉普拉斯算子(Laplacian Operator)

拉普拉斯算子的算法公式定义如下:
L a p l a c e ( f ) = ∂ 2 f ∂ x 2 + ∂ 2 f ∂ y 2 Laplace(f) = \frac{\partial^2f}{\partial x^2} + \frac{\partial^2f}{\partial y^2} Laplace(f)=x22f+y22f
可以看到拉普拉斯算法可以同时对两个维度进行求导,这是它相对于Sobel算法的优势。但是由于拉普拉斯算法还是要求斜率,所以其内部仍然调用了Sobel算法。

API

在OpenCV中,使用Laplacian()函数来进行拉普拉斯计算,其函数原型如下:

void cv::Laplacian(	InputArray	src,							//输入图OutputArray	dst,							//输出图int			ddepth,							//输出的数据类型,-1表示与输入图一致int			ksize = 1,						//卷积核尺寸,必须是正奇数double		scale =1,						//计算结果的放大系数,默认为1,即不放大double		delta = 0,						//计算结果的偏移值,默认为0,即不偏移int			borderType = BORDER_DEFAULT)	//图像边缘的扩充方式,默认为镜像复制
  • ksize = 1时,使用一个 3 × 3 3 \times 3 3×3的卷积核,如下:
    [ 0 1 0 1 − 4 1 0 1 0 ] \begin{bmatrix} 0 & 1 & 0 \\ 1 & -4 & 1 \\ 0 & 1 & 0 \end{bmatrix} 010141010

实例

在进行拉普拉斯求导之前也要进行滤波和灰度化,以去除噪音。
这里我们将拉普拉斯计算的结果中的数据类型定义为CV_16S,是为了防止溢出。接着又通过convertScaleAbs()函数转换回了CV_8U类型。
完整代码如下:

#include <opencv2/imgproc.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>using namespace cv;int main() {Mat src{ imread("lena.jpg") };//高斯滤波Mat blured;GaussianBlur(src, blured, Size(3, 3), 0, 0, BORDER_DEFAULT);//灰度化Mat gray;cvtColor(blured, gray, COLOR_BGR2GRAY);//拉普拉斯Mat dst;Laplacian(gray, dst, CV_16S, 3, 1, 0, BORDER_DEFAULT);//转换为CV_8UMat abs_dst;convertScaleAbs(dst, abs_dst);imshow("原图", src);imshow("Laplace", abs_dst);waitKey(0);
}

运行结果如下:
拉普拉斯运算结果

http://www.lryc.cn/news/417013.html

相关文章:

  • MySQL的下载和安装步骤
  • Java国际版同城服务美容美发到店服务上门服务系统
  • 硬件模拟的基本原理
  • WPF学习(8)- Button按钮
  • Flutter GPU 是什么?为什么它对 Flutter 有跨时代的意义?
  • 第6章>>实验7:PS(ARM)端Linux RT与PL端FPGA之间(通过Memory存储器进行通信和交互)《LabVIEW ZYNQ FPGA宝典》
  • 通用前端的学习
  • git本地仓库关联多个远程仓库时git pull失败问题
  • 人工智能(AI)、Web 3.0和元宇宙三者联系、应用及未来发展趋势的详细分析
  • 【IEEE出版 | 高校主办】第三届人工智能、物联网和云计算技术国际会议(AIoTC 2024)
  • PTA 7-4 BCD解密
  • 计算机网络中拥塞控制的门限值怎么设置
  • 解锁肥胖焦虑的枷锁:拥抱自我,健康前行
  • WPF学习(7)- Control基类+ContentControl类(内容控件)+ButtonBase基类
  • moka实习生一面0607
  • centos开启samba服务
  • 2024年8月一区SCI-海市蜃楼优化算法Fata morgana algorithm-附Matlab免费代码
  • 【编程笔记】解决移动硬盘无法访问文件或目录损坏且无法读取
  • 行为型模式(一)策略模式
  • JAVA中的Wrapper类
  • 在没有硬盘的情况下进行电脑数据迁移
  • C++转Java基础知识
  • 搭建jenkins一键部署java项目
  • 从零到一打造自己的大模型(一)模型实现
  • 【开源项目】基于RTP协议的H264码流发送器和接收器
  • 【C++】4.类和对象(2)
  • 搭建基于树莓派的Linux学习环境(TODO)
  • 《大电机技术》是什么级别的期刊?是正规期刊吗?能评职称吗?
  • Python 中使用 Split 忽略逗号
  • YOLOv10改进 | 主干篇 | YOLOv10引入CVPR2023 顶会论文BiFormer用于主干修改