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

8.10Laplacian算子

实验原理

Laplacian算子也是一种用于边缘检测的技术,它通过查找二阶导数的零交叉点来定位边缘。

cv::Laplacian()函数是OpenCV库提供的一个用于计算图像拉普拉斯算子的函数。拉普拉斯算子是一个二阶微分算子,常用于图像处理中检测边缘或突变区域。它通过计算图像中每个像素点的二阶导数来寻找局部最大值或最小值,从而突出图像中的边缘部分

函数原型

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

参数说明
src: 输入图像,可以是单通道或多通道图像,每个通道可以是8位或32位浮点类型。
dst: 输出图像。输出图像将具有与源图像相同的大小和通道数,但深度由ddepth参数指定。
ddepth: 指定输出图像的深度。可以是CV_16S, CV_32F 或 CV_64F。这决定了计算出的梯度值的类型。
ksize: 拉普拉斯算子的核大小,可以是1, 3, 5, 或 7。当ksize为1时,使用内建的3x3核。其他值对应于相应大小的核。
scale: 可选参数,用于缩放导数结果。默认值为1。
delta: 可选参数,用于加到导数结果上的偏移量。默认值为0。
borderType: 可选参数,指定边界扩展方式。默认值为BORDER_DEFAULT,通常意味着BORDER_REFLECT_101。

内置核
对于ksize=1的情况,OpenCV使用预定义的3x3核:
1  1  1
1 -8  1
1  1  1

示例代码

下面是一个使用cv::Laplacian函数来检测图像边缘的C++示例:

#include <opencv2/opencv.hpp>
#include <iostream>

int main(int argc, char** argv)
{
	// 读取图像文件
	cv::Mat img = cv::imread("9.png", cv::IMREAD_GRAYSCALE);

	if (img.empty())
	{
		std::cout << "Error: Image not found or unable to read the image." << std::endl;
		return -1;
	}

	// 创建输出图像
	cv::Mat laplacian;

	// 计算拉普拉斯边缘
	cv::Laplacian(img, laplacian, CV_16S, 3); // 使用16位深度和3x3核

	// 转换回8位图像
	cv::convertScaleAbs(laplacian, laplacian);

	// 显示原图和拉普拉斯边缘图像
	cv::namedWindow("Original Image", cv::WINDOW_NORMAL);
	cv::imshow("Original Image", img);

	cv::namedWindow("Laplacian Edges", cv::WINDOW_NORMAL);
	cv::imshow("Laplacian Edges", laplacian);

	// 等待用户按键后退出
	cv::waitKey(0);

	return 0;
}

运行结果

在这个示例中,我们读取了一张灰度图像,并使用cv::Laplacian函数计算了图像的拉普拉斯边缘。由于拉普拉斯边缘检测可能会产生负值,所以我们使用CV_16S作为输出深度,以保存这些负值。之后,我们使用cv::convertScaleAbs函数将结果转换为8位图像,这样可以方便地显示出来。最后,我们显示了原始图像和拉普拉斯边缘图像。

请注意,拉普拉斯算子对噪声非常敏感,所以在实际应用中,通常会在应用拉普拉斯算子之前先对图像进行平滑处理,比如使用高斯滤波。这可以通过cv::GaussianBlur函数实现。


http://www.kler.cn/a/299106.html

相关文章:

  • 将4G太阳能无线监控的视频接入电子监控大屏,要考虑哪些方面?
  • dolphinscheduler服务RPC框架源码解析(八)RPC提供者服务整合Spring框架实现
  • 【机器学习】机器学习的基本分类-强化学习(Reinforcement Learning, RL)
  • 开放词汇目标检测(Open-Vocabulary Object Detection, OVOD)综述
  • 林子雨-大数据课程实验报告(一)
  • 线性表查找:Python 实现与性能分析
  • YOLO-v8:yolov8配置文件(yolov8.yaml)说明
  • 自用小问答
  • 分享一个基于微信小程序的医院挂号就诊一体化平台uniapp医院辅助挂号应用小程序设计(源码、调试、LW、开题、PPT)
  • qt通过调节伽马值来调节显示器亮度
  • oracle19.3单机升级到Oracle19.22
  • 主流无线物联网通信技术有哪些
  • 《一个操作系统的实现》--- ubuntu下bochs2.3.5的配置与使用
  • 大宗商品价格在二十多年中的时间序列变化趋势数据分析
  • 计算机毕业设计 家校互联管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • 硬件工程师笔试面试——IGBT
  • 数学基础 -- 勒让德多项式之矩阵与内积
  • 分布式技术概览
  • Netty权威指南:Netty总结-服务端创建
  • MySQL聚合统计:性能优化与高级应用
  • C++学习笔记(16)
  • 【C#Mutex】 initiallyOwned错误引起的缺陷
  • JAVA进阶学习15
  • pnpm解說
  • Selenium 实现图片验证码识别
  • 在VB.net中,TimeSpan有什么属性与方法