OpenCV如何实现拉普拉斯算子的离散模拟

ops/2024/10/21 17:32:19/

 返回:OpenCV系列文章目录(持续更新中......)

上一篇:OpenCV的Sobel 衍生品
下一篇 :OpenCV 如何实现边缘检测器

目标

在本教程中,您将学习如何:

  • 使用 OpenCV 函数 Laplacian() 实现拉普拉斯算子的离散模拟。

理论

  1. 在上一教程中,我们学习了如何使用 Sobel Operator。它基于这样一个事实,即在边缘区域,像素强度显示“跳跃”或强度的高变化。得到强度的一阶导数,我们观察到边缘的特征是最大值,如图所示:

  1. 和。。。如果我们取二阶导数会发生什么?

您可以观察到二阶导数为零!因此,我们也可以使用此标准来尝试检测图像中的边缘。但是,请注意,零不仅会出现在边缘中(它们实际上可以出现在其他无意义的位置);这可以通过在需要时应用过滤来解决。

拉普拉斯算子

  1. 从上面的解释中,我们推断出二阶导数可用于检测边。由于图像是“*2D*”的,我们需要在两个维度上取导数。在这里,拉普拉斯运算符派上用场。
  2. 拉普拉斯运算符的定义如下:

  • 拉普拉斯运算符由函数 Laplacian() 在 OpenCV 中实现。事实上,由于拉普拉斯使用图像的梯度,它在内部调用 Sobel 算子来执行其计算。

C++代码
 

  1. 这个程序是做什么的?
    • 加载图像
    • 通过应用高斯模糊去除噪点,然后将原始图像转换为灰度
    • 将拉普拉斯运算符应用于灰度图像并存储输出图像
    • 在窗口中显示结果教程代码如下所示。您也可以从这里下载
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"using namespace cv;int main( int argc, char** argv )
{// Declare the variables we are going to useMat src, src_gray, dst;int kernel_size = 3;int scale = 1;int delta = 0;int ddepth = CV_16S;const char* window_name = "Laplace Demo";const char* imageName = argc >=2 ? argv[1] : "lena.jpg";src = imread( samples::findFile( imageName ), IMREAD_COLOR ); // Load an image// Check if image is loaded fineif(src.empty()){printf(" Error opening image\n");printf(" Program Arguments: [image_name -- default lena.jpg] \n");return -1;}// Reduce noise by blurring with a Gaussian filter ( kernel size = 3 )GaussianBlur( src, src, Size(3, 3), 0, 0, BORDER_DEFAULT );cvtColor( src, src_gray, COLOR_BGR2GRAY ); // Convert the image to grayscaleMat abs_dst;Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT );// converting back to CV_8UconvertScaleAbs( dst, abs_dst );imshow( window_name, abs_dst );waitKey(0);return 0;
}

解释

声明变量

 // Declare the variables we are going to useMat src, src_gray, dst;int kernel_size = 3;int scale = 1;int delta = 0;int ddepth = CV_16S;const char* window_name = "Laplace Demo";

加载源图像

 const char* imageName = argc >=2 ? argv[1] : "lena.jpg";src = imread( samples::findFile( imageName ), IMREAD_COLOR ); // Load an image// Check if image is loaded fineif(src.empty()){printf(" Error opening image\n");printf(" Program Arguments: [image_name -- default lena.jpg] \n");return -1;}

降低噪音

 // Reduce noise by blurring with a Gaussian filter ( kernel size = 3 )GaussianBlur( src, src, Size(3, 3), 0, 0, BORDER_DEFAULT );

灰度

 cvtColor( src, src_gray, COLOR_BGR2GRAY ); // Convert the image to grayscale

拉普拉斯算子

 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:我们将它们保留为默认值。

将输出转换为 <em>CV_8U</em> 图像

 // converting back to CV_8UconvertScaleAbs( dst, abs_dst );

显示结果

 imshow( window_name, abs_dst );waitKey(0);

结果

  1. 编译上面的代码后,我们可以运行它,将图像的路径作为参数。例如,使用作为输入:

  1. 我们得到以下结果。请注意,树木和奶牛的轮廓是如何大致清晰地定义的(除了强度非常相似的区域,即奶牛头部周围)。另外,请注意,树木后面的房子屋顶(右侧)是臭名昭著的标记。这是因为该区域的对比度较高。

参考文献:

1、 《Laplace Operator》---Ana Huamán



http://www.ppmy.cn/ops/18950.html

相关文章

spring boot 新手入门【1】基础学习

学习开始时间: 2024/03/30 晚上 10:44 基础教程 教程仓库 在线编程 其它教程 1.搭建spring boot 工程&#xff0c;定义HelloController.hello()方法&#xff0c;返回’Hello SpringBoot!’ 要搭建一个简单的Spring Boot工程并定义一个HelloController类&#xff0c;可以按照以…

关于SSL加密,您应该知道什么?

SSL加密&#xff0c;全称为安全套接字层加密&#xff0c;是一种网络安全协议&#xff0c;主要用于在网络通信中提供隐私和数据完整性。它通过在客户端和服务器之间建立一个加密的通道&#xff0c;确保数据在传输过程中不被窃取或篡改。随着互联网的普及和电子商务的快速发展&am…

大型语言模型:奇迹背后的未知哲学,人类智慧的边界探索

大型语言模型可以做出令人瞠目结舌的事情。但没有人确切知道原因。 这是一个问题。弄清楚它是我们这个时代最大的科学难题之一&#xff0c;也是控制更强大的未来模型的关键一步。 多长时间才能学会加法&#xff1f; 两年前&#xff0c;旧金山 OpenAI 公司的研究人员尤里布尔…

小程序 rich-text 解析富文本 图片过大时如何自适应?

在微信小程序中&#xff0c;用rich-text 解析后端返回的数据&#xff0c;当图片尺寸太大时&#xff0c;会溢出屏幕&#xff0c;导致横向出现滚动 查看富文本代码 图片是用 <img 标签&#xff0c;所以写个正则匹配一下图片标签&#xff0c;手动加上样式即可 // content 为后…

【OceanBase诊断调优】—— 4013 内存爆问题的排查

本文介绍 4013 内存爆问题的排查。 内存爆的类型 内存爆主要分为五类&#xff0c;可以通过关键词 OOPS 确定内存爆的类型。 内存爆的类型日志信息&#xff08;关键字为 [OOPS]&#xff09;SINGLE_ALLOC_SIZE_OVERFLOWsingle alloc size large than 4G is not allowed(alloc_…

MQ面试题

为什么要使用消息队列&#xff1f; 优点&#xff1a;解耦、异步、流量削峰 缺点&#xff1a;可用性降低、复杂性提高、一致性问题 为什么选择了RabbitMQ而不是其它的MQ&#xff1f; kafka是以吞吐量高而闻名&#xff0c;不过其数据稳定性一般&#xff0c;而且无法保证消息有…

建造者模式(装修公司装修套餐)

目录 定义 装修公司装修套餐 物料接⼝ 吊顶(ceiling) ⼀级顶 ⼆级顶 涂料(coat) 多乐⼠ ⽴邦 地板(floor) 德尔 圣象 地砖(tile) 东鹏 ⻢可波罗 代码实现 定义装修包接⼝ 装修包实现 建造者⽅法 测试验证 定义 建造者模式所完成的内容就是通过将多个简单对…

SQL 之 小技巧总结

一、如何查询一个字段数据中是否包含特定字符 eg&#xff1a;查看是否包含逗号&#xff08;“,”&#xff09; SELECT * FROM table_name WHERE column_name LIKE %,%;这里&#xff0c;% 是通配符&#xff0c;表示任意数量的任意字符。‘%,%’ 表示查询column_name中包含逗号…