OpenCV(二十五):边缘检测(一)

目录

1.边缘检测原理

2.Sobel算子边缘检测

3.Scharr算子边缘检测

4.两种算子的生成getDerivKernels()


1.边缘检测原理

       其原理是基于图像中灰度值的变化来捕捉图像中的边界和轮廓。梯度则表示了图像中像素强度变化的强弱和方向。 所以沿梯度方向找到有最大梯度值的像素,就可以获得图像中的边缘信息。

2.Sobel算子边缘检测

原理:

        Sobel算子是一种常用的边缘检测算子,它可以通过计算图像的梯度来捕捉图像中的边缘信息。它分别计算图像在x和y方向上的导数,然后根据导数的值确定边缘的位置和强度。

       具体来说,Sobel算子可以通过一个3x3的卷积核在图像上进行卷积操作。有两个Sobel卷积核,一个用于水平方向(x方向)的边缘检测,另一个用于垂直方向(y方向)的边缘检测。这两个卷积核分别如下:

对于输入图像中的每个像素,Sobel算子将使用这些卷积核计算其水平和垂直方向上的梯度。然后,通过对梯度的幅度进行合并,可以计算出每个像素的总梯度大小。总梯度大小表示像素点周围灰度值的变化强度,较大的变化强度通常对应于图像中的边缘。

函数:

cv::Sobel()函数将Sobel算子应用于输入图像进行卷积操作。

函数的原型如下:

CV_EXPORTS_W void Sobel( InputArray src, OutputArray dst, int ddepth,

int dx, int dy, int ksize = 3,

double scale = 1, double delta = 0,

int borderType = BORDER_DEFAULT );

下面是参数的详细解释:

  • src:输入图像,可以是单通道灰度图像或多通道图像。

  • dst:输出图像,与输入图像具有相同的尺寸和类型。

  • ddepth:输出图像的数据类型,它可以是负值(如-1)表示与输入图像保持一致,也可以是CV_8U、CV_16U、CV_32F等值,表示输出图像的深度。

  • dx和dy:分别表示在x和y方向上的导数阶数。可选值为0、1和2。

  • ksize:Sobel内核的大小,必须为1、3、5或7。值越大,滤波器的响应越平缓。

  • scale:可选的缩放因子,用于调整输出图像的值域范围。默认为1。

  • delta:可选的指定delta值,用于调整输出图像的亮度。默认为0。

  • borderType:可选的边界扩充方法,用于处理邻域超出图像边界的情况。默认为cv::BORDER_DEFAULT。

       示例代码:

void Sobel_f(Mat image){Mat gray;cvtColor(image,gray,COLOR_BGR2GRAY);Mat resultX,resultY,resultXY;//X方向一阶边缘Sobel(gray,resultX,CV_16S,1,0,1);convertScaleAbs(resultX,resultX);//Y方向一阶边缘Sobel(gray,resultY,CV_16S,0,1,3);convertScaleAbs(resultY,resultY);//整幅图像的一阶边缘resultXY=resultX+resultY;//显示图像imwrite("/sdcard/DCIM/resultX.png",resultX);imwrite("/sdcard/DCIM/resultY.png",resultY);imwrite("/sdcard/DCIM/resultXY.png",resultXY);}

         (X方向)                                 ( Y方向)                               ( XY方向)

3.Scharr算子边缘检测

原理:

        Scharr算子是一种边缘检测算子,它是Sobel算子的改进版本。Scharr算子采用了更加精确的权重分配,可以提供更好的边缘检测性能。

        Scharr算子也是通过卷积操作来计算图像的梯度,类似于Sobel算子。它包含两个卷积核,一个用于水平方向(x方向)的边缘检测,另一个用于垂直方向(y方向)的边缘检测。

        Scharr算子的差异在于卷积核中的权重分配相对于Sobel算子更加平衡,以提高对边缘信号的敏感度。这种平衡权重的分配可以产生更加准确的梯度估计。

        Scharr算子使用相同的原理来计算像素点周围的梯度大小和方向。通过在x和y方向上对梯度进行计算,并根据梯度的幅度和方向确定边缘的位置和强度。

函数:

cv::Scharr()函数是OpenCV中的一个函数,用于计算图像的Scharr导数。它类似于Sobel算子,但是使用了更准确的权重分配。

函数原型:

CV_EXPORTS_W 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:输出图像的数据类型,可以是负值(如-1),表示与输入图像保持一致,也可以是CV_8U、CV_16U、CV_32F等值,表示输出图像的深度。

  • dx和dy:分别表示在x和y方向上的导数阶数。可选值为0、1和2。

  • scale:可选的缩放因子,用于调整输出图像的值域范围。默认为1。

  • delta:可选的指定delta值,用于调整输出图像的亮度。默认为0。

  • borderType:可选的边界扩充方法,用于处理邻域超出图像边界的情况。默认为cv::BORDER_DEFAULT。

示例代码:


void Scharr_f(Mat img) {Mat image;cvtColor(img,image,COLOR_BGR2GRAY);cv::Mat grad_x, grad_y; // 存放Scharr滤波器的梯度cv::Mat abs_grad_x, abs_grad_y; // 存放梯度的绝对值// 计算X方向的Scharr滤波器cv::Scharr(image, grad_x, CV_16S, 1, 0);cv::convertScaleAbs(grad_x, abs_grad_x);// 计算Y方向的Scharr滤波器cv::Scharr(image, grad_y, CV_16S, 0, 1);cv::convertScaleAbs(grad_y, abs_grad_y);// 合并X和Y方向的梯度cv::Mat grad;cv::addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad);// 显示结果imwrite("/sdcard/DCIM/grad.png",grad);
}

结果: (grad)

4.两种算子的生成getDerivKernels()

getDerivKernels()函数是OpenCV中用于生成一维卷积核的函数,可用于计算图像的一阶导数。

函数的原型如下:

void cv::getDerivKernels ( OutputArray kx,

OutputArray ky,

int    dx,

int    dy,

int   ksize,

bool   normalize =false,

int   ktype = CV_32F

)

  • kx:行滤波器系数的输出矩阵,尺寸为ksize*1
  • ky:列滤波器系数的输出矩阵,尺寸为ksize*1。
  • dx:X方向导数的阶次。
  • dy:Y方向导数的阶次
  • ksize:滤波器的大小,可以选择的参数为FILTER SCHARR,1.35或7。
  • normalize: 是否对滤波器系数进行归一化的标志,默认值为false,表示不进行系数归一化。
  • ktype:滤波器系数类型,可以选择CV 32F或CV 64F,默认参数为CV 32F。

示例代码:

以下是一个使用使用getDerivKernels()函数来生成Sobel和Scharr算子卷积核的示例:

//生成边缘检测器
void f(){cv::Mat sobel_xl, sobel_yl; // 存放分离的Sobel算子cv::Mat scharr_x, scharr_y; // 存放分离的Scharr算子cv::Mat sobelXl, scharrX; // 存放最终算子// 一阶X方向Sobel算子cv::getDerivKernels(sobel_xl, sobel_yl, 1, 0, 3);sobel_xl = sobel_xl.reshape(1, 1); // 转换为单行矩阵sobelXl = sobel_yl * sobel_xl; // 计算滤波器// X方向Scharr算子cv::getDerivKernels(scharr_x, scharr_y, 1, 0, cv::FILTER_SCHARR);scharr_x = scharr_x.reshape(1, 1); // 转换为单行矩阵scharrX = scharr_y*scharr_x; // 计算滤波器ostringstream ss;// 打印生成的卷积核ss<< "Sobel X方向卷积核:" << sobelXl << endl;ss << "Scharr X方向卷积核:" << scharrX <<endl;LOGD("%s",ss.str().c_str());
}

我们使用getDerivKernels()函数生成了X方向Sobel算子和X方向Scharr算子的卷积核。然后,我们将其转换为单行矩阵,并通过乘法运算计算得到滤波器。

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

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

相关文章

Linux网络编程 网络基础知识

目录 1.网络的历史和协议的分成 2.网络互联促成了TCP/IP协议的产生 3.网络的体系结构 4.TCP/IP协议族体系 5.网络各层的协议解释 6.网络的封包和拆包 7.网络预备知识 1.网络的历史和协议的分成 Internet-"冷战"的产物 1957年十月和十一月&#xff0c;前苏…

C#__线程的优先级和状态控制

线程的优先级&#xff1a; 一个CPU同一时刻只能做一件事情&#xff0c;哪个线程优先级高哪个先运行&#xff0c;优先级相同看调度算法。 在Thread类中的Priority属性&#xff08;Highest,Above,Normal,BelowNormal,Lowest&#xff09;可以影响线程的优先级 关于…

swiper删除虚拟slide问题

在存在缓存的情况下&#xff0c;删除较前的slide&#xff0c;会出现当前slide与后一个slide重复出现的情况 假设当前存在5个slide&#xff0c;且这5个slide已缓存&#xff0c;则删除slide2后&#xff0c;仍为5个slide&#xff0c;且slide2的内容变为slide3的内容&#xff0c;此…

Pushgetway安装和使用

1、Pushgetway安装和使用 1.1 Pushgateway是什么 pushgateway 是另一种数据采集的方式&#xff0c;采用被动推送来获取监控数据的prometheus插件&#xff0c;它可以单独运行在 任何节点上&#xff0c;并不一定要运行在被监控的客户端。 首先通过用户自定义编写的脚本把需要监…

记一次时间序列算法的自回归预测--ARAutoreg

背景 最近公司给客户要做一些数据的预测&#xff0c;但是客户不清楚哪些做起来比较符合他们的&#xff0c;于是在经过与业务方的沟通&#xff0c;瞄准了两个方面的数据 1.工程数据&#xff1a;对工程数据做评估&#xff0c;然后做预警&#xff0c;这个想法是好的&#xff0c;…

DGIOT-Modbus-RTU控制指令05、06的配置与下发

[小 迪 导 读]&#xff1a;伴随工业物联网在实际应用中普及&#xff0c;Modbus-RTU作为行业内的标准化通讯协议。在为物联网起到采集作用的同时&#xff0c;设备的控制也是一个密不可分的环节。 场景解析&#xff1a;在使用Modbus对设备进行采集后&#xff0c;可以通过自动控制…

多波束测线问题

多波束测线问题 问题的背景是海洋测深技术&#xff0c;特别是涉及单波束测深和多波束测深系统。这些系统利用声波传播原理来测量水体深度。 单波束测深系统通过向海底发射声波信号并记录其返回时间来测量水深。该系统的特点是每次只有一个波束打到海底&#xff0c;因此数据分布…

理解项目开发(寺庙小程序)

转载自&#xff1a;历经一年&#xff0c;开发一个寺庙小程序&#xff01; (qq.com) 破防了&#xff01;为方丈开发一款纪念小程序&#xff01; (qq.com) 下面内容转载自&#xff1a;程序员5K为青岛啤酒节开发个点餐系统&#xff01; (qq.com) 看一个人如何完成一个项目的开发…

CSS笔记(黑马程序员pink老师前端)浮动,清除浮动

浮动可以改变标签的默认排列方式。浮动元素常与标准流的父元素搭配使用. 网页布局第一准则:多个块级元素纵向排列找标准流&#xff0c;多个块级元素横向排列找浮动。 float属性用于创建浮动框&#xff0c;将其移动到一边&#xff0c;直到左边缘或右边缘触及包含块或另一个浮动框…

分类预测 | MATLAB实现PCA-LSTM(主成分长短期记忆神经网络)分类预测

分类预测 | MATLAB实现PCA-LSTM(主成分长短期记忆神经网络)分类预测 目录 分类预测 | MATLAB实现PCA-LSTM(主成分长短期记忆神经网络)分类预测预测效果基本介绍程序设计参考资料致谢 预测效果 基本介绍 MATLAB实现PCA-LSTM(主成分长短期记忆神经网络)分类预测。Matlab实现基于P…

【java】【项目实战】[外卖十一]项目优化(Ngnix)

目录 一、Nginx概述 1、Nginx介绍 2、Nginx下载和安装 3、Nginx目录结构 二、Nginx命令 1、查看版本 2、检查配置文件正确性 3、启动和停止 4、重新加载配置文件 三、Nginx配置文件结构 1、全局块 2、events块 3、http块 四、Nginx具体应用 1、部署静态资源 2、…

LeetCode 904. 水果成篮

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 在你去摘水果的时候&#xff0c;你当前只能拥有两种种类的水果&#xff0c;若想拿第三种水果&#xff0c;就需要发下前两种水果中的一种。 法一&#xff1a;滑动窗口哈希表(未优化…

【Linux】shell脚本和bat脚本:

文章目录 一、脚本对应环境&#xff1a;【1】shell&#xff1a;linux环境&#xff1b;后缀名为.sh【2】bat&#xff1a;windows环境&#xff1b;后缀名为.bat或者.cmd 二、脚本执行&#xff1a;【1】shell执行【2】bat脚本执行 三、脚本相关命令&#xff1a;1. shell命令【1】s…

有向图和无向图的表示方式(邻接矩阵,邻接表)

目录 一.邻接矩阵 1.无向图​编辑 2.有向图 补充&#xff1a;网&#xff08;有权图&#xff09;的邻接矩阵表示法 二.邻接表 1.无向图 2.有向图 三.邻接矩阵与邻接表的关系 一.邻接矩阵 1.无向图 &#xff08;1&#xff09;对角线上是每一个顶点与自身之间的关系&…

数据库(MySQL)的存储过程

一、存储过程介绍 存储过程是事先经过编译并存储在数据库中的一段SQL 语句的集合&#xff0c;调用存储过程可以简化应用开发人员的很多工作&#xff0c;减少数据在数据库和应用服务器之间的传输&#xff0c;对于提高数据处理的效率是有好处的。 存储过程思想上很简单&#xff0…

多功能透明屏,在智能家居领域中,有哪些功能特点?显示、连接

多功能透明屏是一种新型的显示技术&#xff0c;它能够在透明的表面上显示图像和视频&#xff0c;并且具有多种功能。 这种屏幕可以应用于各种领域&#xff0c;如商业广告、智能家居、教育等&#xff0c;为用户提供更加便捷和多样化的体验。 首先&#xff0c;多功能透明屏可以…

[HNCTF 2022 Week1]——Web方向 详细Writeup

Week1 [HNCTF 2022 Week1]2048 f12查看源代码 可以看出游戏的分数是score 修改score的值 得到flag [HNCTF 2022 Week1]Interesting_include 得到源码 <?php //WEB手要懂得搜索 //flag in ./flag.phpif(isset($_GET[filter])){$file $_GET[filter];if(!preg_match(&qu…

3次多项式轨迹规划(PLC SCL代码)

机器人、运动控制等常用的轨迹规划有三次多项式、五次多项式、梯形速度规划,S型速度规划,今天我们主要介绍三次多项式轨迹规划,有关T型和S型轨迹规划大家可以查看下面文章博客,这里不再赘述, 梯形轨迹规划 梯形速度曲线轨迹规划(速度前馈+PID、SCL+ ST代码)_RXXW_Dor的博…

雅思写作 三小时浓缩学习顾家北 笔记总结(五)

目录 饥饿网100句翻译练习 Many girls are unwilling to seek employment in male-dominated industries. Many girls are not willing to find jobs in male-dominated industries. The main function of schools is to impart knowledge to the next generation. The ar…

Kafka3.0.0版本——增加副本因子

目录 一、服务器信息二、启动zookeeper和kafka集群2.1、先启动zookeeper集群2.2、再启动kafka集群 三、增加副本因子3.1、增加副本因子的概述3.2、增加副本因子的示例3.2.1、创建topic(主题)3.2.2、手动增加副本存储 一、服务器信息 四台服务器 原始服务器名称原始服务器ip节点…