《opencv实用探索·十二》opencv之laplacian(拉普拉斯)边缘检测,Scharr边缘检测,Log边缘检测

1、Laplacian算子
Laplacian(拉普拉斯)算子是一种二阶导数算子,其具有旋转不变性,可以满足不同方向的图像边缘锐化(边缘检测)的要求。同时,在图像边缘处理中,二阶微分的边缘定位能力更强,锐化效果更好,因此在进行图像边缘处理时,直接采用二阶微分算子而不使用一阶微分。

通常情况下,其算子的系数之和需要为零。 Laplacian算子具有各方向同性的特点,能够对任意方向的边缘进行提取,具有无方向性的优点,因此使用Laplacian算子提取边缘不需要分别检测X方向的边缘和Y方向的边缘,只需要一次边缘检测即可。Laplacian算子是一种二阶导数算子,对噪声比较敏感,因此常需要配合高斯滤波一起使用。
Laplacian使用的卷积核如下:
在这里插入图片描述
像素点的近似导数值计算:
左图是 Laplacian 算子,右图是一个简单图像,其中有 9 个像素点。
在这里插入图片描述
计算像素点 P5 的近似导数值,如下:
P5 = (P2 + P4 + P6 + P8) - 4*P5

下面是一些实际计算的例子:
在左图中,像素点 P5 与周围像素点的值相差较小,得到的计算结果值较小,边缘不明显。
在中间的图中,像素点 P5 与周围像素点的值相差较大,得到的计算结果值较大,边缘较明显。
在右图中,像素点 P5 与周围像素点的值相差较大,得到的计算结果值较大,边缘较明显。
在这里插入图片描述

需要注意,在上述卷积核与图像进行卷积运算后,计算结果的值可能为正数,也可能为负数。所以,需要对计算结果取绝对值,以保证后续运算和显示都是正确的。

opencv之Laplacian接口调用:

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

src:输入图像,可以是任意通道数的图像,但通常是单通道灰度图像。
dst:输出图像,与输入图像src具有相同的尺寸和通道数
ddepth:输出图像的深度,若src为CV_8U,则可取-1/CV_16S/CV_32F/CV_64F;若src为CV_16U/CV_16S,可取-1/CV_32F/CV_64F;若src为CV_32F,可取-1/CV_32F/CV_64F;若src为CV_64F,可取-1/CV_64F。,当赋值为-1时,输出图像的数据类型自动选择。
ksize:用于计算二阶导数的核尺寸大小,必须为正奇数。
scale:对导数计算结果进行缩放的缩放因子,默认系数为1,表示不进行缩放。也称对比度
delta:偏值,在计算结果中加上偏值。也称亮度
borderType:像素外推法选择标志,默认参数为BORDER_DEFAULT,表示不包含边界值倒序填充。

ddepth说明:
ddepth 参数表示输出图像的深度,即输出图像的数据类型。它决定了输出图像中像素值的数据范围和存储格式。
常见的选项包括:
CV_8U:8位无符号整数,表示范围为 [0, 255]。
CV_16U:16位无符号整数,表示范围为 [0, 65535]。
CV_16S:16位有符号整数,表示范围为 [-32768, 32767]。
CV_32F:32位浮点数。
CV_64F:64位浮点数。

选择合适的深度类型取决于你的应用和对图像数据的要求。例如,如果你希望保留边缘检测操作中的负值,可能会选择使用浮点数类型(如 CV_64F),因为它可以存储负数。如果你只关心边缘的存在与否而不关心边缘的方向,那么使用无符号整数类型可能更合适。
在Laplacian算子中,通常选择 CV_16S 或 CV_64F 作为 ddepth,因为Laplacian操作可能产生负值,而这些负值在 CV_8U 类型中会被截断为零。在显示图像之前,通常需要对结果进行取绝对值(cv::abs())并进行数据类型转换。

下面代码为使用拉普拉斯检测边缘的一个demo:

#include <opencv2/opencv.hpp>
#include <iostream>int main() 
{  //载入原始图Mat src = imread("1.jpg");//【1】定义变量Mat src_gray, dst, abs_dst;//【2】显示原图imshow("原始图", src);//【3】使用高斯滤波消除噪声GaussianBlur(src, src, Size(3, 3), 0);//【4】转为灰度图cvtColor(src, src_gray, COLOR_BGR2GRAY);//【5】Laplacian查找边缘Laplacian(src_gray, dst, CV_16S, 3);//【6】计算绝对值,并将结果转为8位convertScaleAbs(dst, abs_dst);//【7】显示效果图imshow("Laplacian变换", abs_dst);cout << "Laplacian算法输出图像的通道" << abs_dst.channels() << endl;waitKey(0);destroyAllWindows();return 0;
}

效果图如下,左边是原图,右边是拉普拉斯边缘检测图:
在这里插入图片描述

2、Scharr 算子
scharr算子和sobel的原理一致(sobel算子看上一章内容),但scharr算子对于边界的梯度计算效果更精确

他们的区别在于:
(1)是Gx和Gy参数的大小不同,也就是卷积核中各元素的权不同,其他都一样,scharr算子对于边界的梯度计算效果更精确;
(2)Scharr算子的核设计更加平滑,这使得其在一定程度上对噪声具有更好的鲁棒性;
(3)由于Scharr算子的核更复杂,因此在计算上可能相对Sobel算子更为耗时。

在实际应用中,选择Scharr还是Sobel通常取决于具体的场景和需求。如果对边缘的敏感度较高,并且噪声较少,Scharr算子可能是一个更好的选择。如果计算效率和简单性更为重要,那么Sobel算子可能更适合。

Scharr在X和Y轴方向的卷积核如下:
在这里插入图片描述
opencv之Scharr算子接口说明:

void Scharr( InputArray src, OutputArray dst, int ddepth,int dx, int dy, double scale = 1, double delta = 0,int borderType = BORDER_DEFAULT )

src: 输入图像,可以是任意通道数的图像。
dst: 输出图像,算法的结果将存储在这里。
ddepth: 输出图像的深度,若src为CV_8U,则可取-1/CV_16S/CV_32F/CV_64F;若src为CV_16U/CV_16S,可取-1/CV_32F/CV_64F;若src为CV_32F,可取-1/CV_32F/CV_64F;若src为CV_64F,可取-1/CV_64F。,当赋值为-1时,输出图像的数据类型自动选择。
dx 和 dy: x 和 y 方向的导数阶数,通常为 0 或 1。0表示这个方向上没有求导。
scale: 可选参数,表示缩放因子,默认为1。
delta: 可选参数,表示在卷积结果上加上的偏置,默认为0。
borderType: 可选参数,用于指定边界模式,默认为 cv::BORDER_DEFAULT

代码演示:

#include <opencv2/opencv.hpp>
#include <iostream>int main() 
{  // 读取图像cv::Mat image = cv::imread("1.jpg", cv::IMREAD_GRAYSCALE);// 检查图像是否成功读取if (image.empty()) {std::cerr << "Error: Could not read the image." << std::endl;return -1;}// 应用Scharr算子分别获取X和Y方向一阶边缘cv::Mat scharrX, scharrY;cv::Scharr(image, scharrX, CV_16S, 1, 0);cv::Scharr(image, scharrY, CV_16S, 0, 1);// 计算绝对值,并将结果转为8位// 因为卷积操作可能产生负值,而这些负值在 CV_8U 类型中会被截断为零。在显示图像之前,通常需要对结果进行取绝对值(cv::abs())并进行数据类型转换。convertScaleAbs(scharrX, scharrX);convertScaleAbs(scharrY, scharrY);// 显示原始图像和Scharr算子的输出cv::imshow("Original Image", image);cv::imshow("Gradient Magnitude", scharrX + scharrY);waitKey(0);![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/8899b12d049441cb8d7d24a110581414.png)destroyAllWindows();return 0;
}

效果图如下,左边是原图,右边是Scharr边缘检测图
在这里插入图片描述

3、Log算子
LoG(Laplacian of Gaussian)算子结合了高斯滤波和拉普拉斯边缘检测,用于检测图像中的边缘。LoG算子首先对图像进行高斯平滑,然后应用拉普拉斯算子。这有助于减少噪声的影响,并突出图像中的边缘。
在OpenCV中,cv::GaussianBlur和cv::Laplacian函数可以用于实现LoG算子的操作。

#include <opencv2/opencv.hpp>
#include <iostream>int main() {// 读取图像cv::Mat image = cv::imread("your_image.jpg", cv::IMREAD_GRAYSCALE);// 检查图像是否成功读取if (image.empty()) {std::cerr << "Error: Could not read the image." << std::endl;return -1;}// 高斯平滑cv::Mat blurred;cv::GaussianBlur(image, blurred, cv::Size(5, 5), 0);// 应用拉普拉斯算子cv::Mat laplacian;cv::Laplacian(blurred, laplacian, CV_64F);// 取绝对值并转换为8位无符号整数laplacian = cv::abs(laplacian);laplacian.convertTo(laplacian, CV_8U);// 显示原始图像和LoG算子的输出cv::imshow("Original Image", image);cv::imshow("LoG Operator", laplacian);// 等待用户按键cv::waitKey(0);return 0;
}
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/255069.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MJPG-streamer方案实现物联网视频监控

目录 前言 一、JPEG&#xff0c;MJPG格式简介 JPEG MJPG MJPG的优点 MJPG的缺点 二、软硬件准备 三、编译MJPG-streamer 四、运行MJPG-streamer 五、其它常见用法 六、MJPG-streamer 程序框架 七、源码下载 前言 最近想做一个安防相关的项目&#xff0c;所以跟着韦…

Python语言基础知识(一)

文章目录 1、Python内置对象介绍2、标识符与变量3、数据类型—数字4、数据类型—字符串与字节串5、数据类型—列表、元组、字典、集合6、运算符和表达式7、运算符和表达式—算术运算符8、运算符和表达式—关系运算符9.1、运算符和表达式— 成员测试运算符in9.2、运算符和表达式…

jQuery ajax读取本地json文件 三级联动下拉框

步骤 1&#xff1a;创建本地JSON文件 {"departments": [{"name": "会计学院","code": "052"},{"name": "金融学院","code": "053"},{"name": "财税学院",&qu…

CRM客户管理系统,不止管理客户。

CRM系统现在已经成为企业与客户建立良好关系、提高销售业绩的优先选择。关于CRM的功能&#xff0c;不同的企业包括CRM软件厂商都对CRM系统有不同的定义。基于此&#xff0c;我们来聊聊CRM客户管理系统除了管客户还有什么功能&#xff1f; 1、客户管理 有些企业管理客户的方式…

探索低代码的潜力、挑战与未来展望

低代码开发作为一种新兴的开发方式&#xff0c;正在逐渐改变着传统的编程模式&#xff0c;低代码使得开发者无需编写大量的代码即可快速构建各种应用程序。然而&#xff0c;低代码也引发了一系列争议&#xff0c;有人称赞其为提升效率的利器&#xff0c;也有人担忧其可能带来的…

GUI的简单概述和基本使用

GUI的概念 1&#xff0c;到目前为止&#xff0c;我们编写的都是控制输入的程序&#xff0c;操作使用非常不直观&#xff0c;采取一直方式让效果呈现在窗口上。 2&#xff0c;GUI及图形界面指采用图像方式显示的用户界面&#xff0c;与早期计算机的命令行界面相比&#xff0c;…

文件拖拽操作工具 Dropzone 4 最新 for mac

Dropzone 4是一款Mac平台上的应用程序&#xff0c;提供了一个方便快捷的方式来执行各种任务。它可以将常用工具和操作整合到一个简洁的界面中&#xff0c;使用户能够更高效地完成日常工作。 以下是Dropzone 4的一些主要特点&#xff1a; 拖放功能&#xff1a;通过将文件、文件…

拨号连接bat命令和拨号错误623,系统无法找到此连接的电话簿项的解决方法

一、拨号bat命令 1、首先创建一个拨号连接&#xff0c;注意连接名称要使用英文 2、创建一个bat文件&#xff0c;里面内容 echo off chcp 65001rem 定义连接参数&#xff0c;第一个是用户名&#xff0c;第二个是密码 set usernameS11111111111 set passwords11111111111 set…

决战排序之巅(一)

决战排序之巅 插入排序直接插入排序 void InsertSort(int* arr, int n)希尔排序 void ShellSort(int* arr, int n)测试插入排序测试函数 void verify(int* arr, int n)测试 InsertSort测试 ShellSort测试速度 InsertSort & ShellSort 选择排序直接选择排序 void SelectSort…

数据分析基础之《matplotlib(3)—散点图》

一、常见图形种类及意义 1、matplotlib能够绘制折线图、散点图、柱状图、直方图、饼图。我们需要知道不同的统计图的意义&#xff0c;以此来决定选择哪种统计图来呈现我们的数据 2、折线图plot 说明&#xff1a;以折线的上升或下降来表示统计数量的增减变化的统计图 特点&…

vs2022linux应用开发中出现“未定义标识符_Float128“

开发平台包括&#xff1a;Win11、VS2022、WLS2。 当vs2022对应用程序报编译错误时&#xff0c;有时也会报以下信息&#xff1a; 但应用程序没有编译错误后&#xff0c;上述信息不再出现。

解析100G QSFP28 ER4光模块:超越传统光纤传输限制

科技的进步和数据中心的快速发展&#xff0c;使得高速光通信模块的需求也在不断增长。100G QSFP28 ER4光模块作为一种新型的高速光通信模块&#xff0c;正逐渐受到广泛关注。前几期文章内容我们了解了40G ER4 系列光模块产品&#xff0c;今天跟随小易来看看更高速率的100G ER4光…