opencv基础 42- Scharr算子-cv2.Scharr()(边缘检测基础)

news2024/12/27 12:22:27

Scharr算子是用于计算图像梯度的一种常用算子,特别是在边缘检测任务中。它是Sobel算子的改进版本,旨在提供更加准确和敏感的边缘检测。

在离散的空间上,有很多方法可以用来计算近似导数,在使用 3×3 的 Sobel 算子时,可能计算结果并不太精准。OpenCV 提供了 Scharr 算子,该算子具有和 Sobel 算子同样的速度,且精度更高。可以将 Scharr 算子看作对 Sobel 算子的改进,其核通常为:

在这里插入图片描述
OpenCV 提供了函数 cv2.Scharr()来计算 Scharr 算子,其语法格式如下:

dst = cv2.Scharr( src, ddepth, dx, dy[, scale[, delta[, borderType]]] )

式中:

  • dst 代表输出图像。
  • src 代表原始图像。
  • ddepth 代表输出图像深度。该值与函数 cv2.Sobel()中的参数 ddepth 的含义相同,具体可
    以参考上节表 9-1。
  • dx 代表 x 方向上的导数阶数。
  • dy 代表 y 方向上的导数阶数。
  • scale 代表计算导数值时的缩放因子,该项是可选项,默认值是 1,表示没有缩放。
  • delta 代表加到目标图像上的亮度值,该项是可选项,默认值为 0。
  • borderType 代表边界样式。具体可以参考上节表 9-2。

在函数 cv2.Sobel()中介绍过,如果 ksize=-1,则会使用 Scharr 滤波器。

因此,如下语句:

dst=cv2.Scharr(src, ddepth, dx, dy)

dst=cv2.Sobel(src, ddepth, dx, dy, -1)

是等价的。

函数 cv2.Scharr()和函数 cv2.Sobel()的使用方式基本一致。
首先,需要注意的是,参数 ddepth 的值应该设置为“cv2.CV_64F”,并对函数 cv2.Scharr()的计算结果取绝对值,才能保证得到正确的处理结果

具体语句为:

dst=Scharr(src, cv2.CV_64F, dx, dy)
dst= cv2.convertScaleAbs(dst)

另外,需要注意的是,在函数 cv2.Scharr()中,要求参数 dx 和 dy 满足条件:

dx >= 0 && dy >= 0 && dx+dy == 1

因此,参数 dx 和参数 dy 的组合形式有:

  • 计算 x 方向边缘(梯度):dx=1, dy=0。
  • 计算 y 方向边缘(梯度): dx=0, dy=1。
  • 计算 x 方向与 y 方向的边缘叠加:通过组合方式实现。

下面分别对上述情况进行简要说明。

  1. 计算x方向边缘(梯度):dx=1, dy=0
    此时,使用的语句是:
dst=Scharr(src, ddpeth, dx=1, dy=0)
  1. 计算y方向边缘(梯度):dx=0,dy=1
    此时,使用的语句是:
dst=Scharr(src, ddpeth, dx=0, dy=1)
  1. 计算x方向与y方向的边缘叠加

将两个方向的边缘相加,使用的语句是:

dx=Scharr(src, ddpeth, dx=1, dy=0)
dy=Scharr(src, ddpeth, dx=0, dy=1)
Scharrxy=cv2.addWeighted(dx,0.5,dy,0.5,0)

需要注意的是,参数 dx 和 dy 的值不能都为 1。

例如,如下语句是错误的:

dst=Scharr(src, ddpeth, dx=1, dy=1)

示例:使用函数 cv2.Scharr()获取图像水平方向的边缘信息。

import cv2
o = cv2.imread('scharr.bmp',cv2.IMREAD_GRAYSCALE)
Scharrx = cv2.Scharr(o,cv2.CV_64F,1,0)
Scharrx = cv2.convertScaleAbs(Scharrx)
cv2.imshow("original",o)
cv2.imshow("x",Scharrx)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

使用函数 cv2.Scharr()获取图像垂直方向的边缘信息。

import cv2
o = cv2.imread('Scharr.bmp',cv2.IMREAD_GRAYSCALE)
Scharry = cv2.Scharr(o,cv2.CV_64F,0,1)
Scharry = cv2.convertScaleAbs(Scharry)
cv2.imshow("original",o)
cv2.imshow("y",Scharry)
cv2.waitKey()
cv2.destroyAllWindows()

运行结果:
在这里插入图片描述

使用函数 cv2.Scharr()实现水平方向和垂直方向边缘叠加的效果。

代码如下:

import cv2
o = cv2.imread('scharr.bmp',cv2.IMREAD_GRAYSCALE)
scharrx = cv2.Scharr(o,cv2.CV_64F,1,0)
scharry = cv2.Scharr(o,cv2.CV_64F,0,1)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.convertScaleAbs(scharry)
scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5,0)
cv2.imshow("original",o)
cv2.imshow("xy",scharrxy)
cv2.waitKey()
cv2.destroyAllWindows()

运行结果:
在这里插入图片描述

Sobel 算子和 Scharr 算子的比较

Sobel 算子的缺点是,当其核结构较小时,精确度不高,而 Scharr 算子具有更高的精度。
Sobel 算子和 Scharr 算子的核结构如图 9-22 所示。

在这里插入图片描述

代码示例:

分别使用 Sobel 算子和 Scharr 算子计算一幅图像的水平边缘和垂直边缘的叠加信息。

import cv2
o = cv2.imread('lena.png',cv2.IMREAD_GRAYSCALE)
Sobelx = cv2.Sobel(o,cv2.CV_64F,1,0,ksize=3)
Sobely = cv2.Sobel(o,cv2.CV_64F,0,1,ksize=3)
Sobelx = cv2.convertScaleAbs(Sobelx)
Sobely = cv2.convertScaleAbs(Sobely)
Sobelxy = cv2.addWeighted(Sobelx,0.5,Sobely,0.5,0)
Scharrx = cv2.Scharr(o,cv2.CV_64F,1,0)
Scharry = cv2.Scharr(o,cv2.CV_64F,0,1)
Scharrx = cv2.convertScaleAbs(Scharrx)
Scharry = cv2.convertScaleAbs(Scharry)
Scharrxy = cv2.addWeighted(Scharrx,0.5,Scharry,0.5,0)
cv2.imshow("original",o)
cv2.imshow("Sobelxy",Sobelxy)
cv2.imshow("Scharrxy",Scharrxy)
cv2.waitKey()
cv2.destroyAllWindows()

运行结果:
在这里插入图片描述

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

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

相关文章

Android进阶之SeekBar动态显示进度

SeekBar 在开发中并不陌生,默认的SeekBar是不显示进度的,当然用吐司或者文案在旁边实时显示也是可以的,那能不能移动的时候才显示,默认不显示呢,当然网上花哨的三方工具类太多了,但是我只是单纯的想在SeekBar的基础上去添加一个可以跟随移动显示的气泡而…

循环结构的学习

循环结构 文章目录 为什么要学习循环while循环dowhile循环偶数之和断点调试购物结算循环的选择类名和全类名摄氏华氏对照表for循环for执行次序五门功课成绩for的特殊写法break和continue录入客户信息_continue使代码优雅小数的比较不能用或! 为什么要学习循环 在编写代码时&a…

mysql死锁分析show engine innodb status

文章目录 1、show engine innodb status命令2、前置知识3、无符号数、有符号数4、innodb关于有符号数的规定5、为什么会有这个规定 1、show engine innodb status命令 最近在使用mysql的show engine innodb status命令分析死锁,发现了一个有意思的点。就是红框里圈…

【小梦C嘎嘎——启航篇】类和对象(中篇)

【小梦C嘎嘎——启航篇】类和对象(中篇)😎 前言🙌类的6个默认成员函数构造函数析构函数拷贝构造函数拷贝构造函数的特性有哪些?既然编译器可以自动生成一个拷贝构造函数,为什么我们还要自己设计实现呢&…

python数据分析 期末测验,python数据分析基础题库

大家好,小编为大家解答python数据分析选择题题目的问题。很多人还不知道python数据分析题目和答案,现在让我们一起来看看吧! 自测试卷 5 一、选择题 1 .下面关于 RFM 模型说法正确的是( )。 A .…

微信小程序(由浅到深)

文章目录 一. 项目基本配置1. 项目组成2. 常见的配置文件解析3. app.json全局的五大配置4.单个页面中的page配置5. App函数6.tabBar配置 二. 基本语法,事件,单位1. 语法2. 事件3. 单位 三. 数据响应式修改四 . 内置组件1. button2. image3. input4. 组件…

钓鱼攻击:相似域名识别及如何有效预防攻击

网络犯罪分子很乐意劫持目标公司或其供应商或业务合作伙伴的官方域名,但在攻击的早期阶段,他们通常没有这种选择。相反,在有针对性的攻击之前,他们会注册一个与受害组织的域名相似的域名 - 他们希望您不会发现其中的差异。此类技术…

opencv基础51-图像轮廓04-轮廓多种图形拟合讲解及示例

轮廓拟合(Contour Fitting)是指在图像处理中,通过一些数学模型或曲线拟合方法来近似描述图像中的轮廓。图像中的轮廓是指物体的边界,轮廓拟合可以用于提取、描述和分析物体的形状。 常用的轮廓拟合方法包括多项式拟合、贝塞尔曲线…

【刷题笔记8.9】LeetCode题目:两数相加

LeetCode题目2:两数相加 题目及描述 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设…

【uniapp】封装一个全局自定义的模态框

【需求描述】 在接口401处,需要实现全局提示并弹出自定义模态框的功能。考虑到uni-app内置的模态框和app原生提示框的自定义能力有限,我决定自行封装全局自定义的模态框,以此为应用程序提供更加统一且个性化的界面。 【效果图】 【封装】 主…

Ansible Playbook快速部署一主多从MySQL集群

部署目标: 1、快速部署一套一主两从的mysql集群 2、部署过程中支持交互式定义安装目录及监听端口号 部署清单目录结构: rootmaster:/opt/mysql# tree . . ├── group_vars │ └── all.yml ├── hosts ├── mysql.yml └── roles└── mys…

两个状态的马尔可夫链

手动推导如下公式。 证明: 首先将如下矩阵对角化: { 1 − a a b 1 − b } \begin {Bmatrix} 1-a & a \\ b & 1-b \end {Bmatrix} {1−ab​a1−b​} (1)求如下矩阵的特征值: { 1 − a a b 1 − b } { x 1 x 2 } λ { x 1 x 2 }…

Android Https

本质:在客户端和服务端使用非对称加密协商出一套对称密钥,每次发送数据前加密,收到后解密,达到加密传输 http ssl 在http之下增加了安全层,用于保障http的加密传输 HTTPS连接 TLS连接步骤 1.客户端发送 client h…

Apache Doris 入门教程25:通过开启 Debug 日志进行性能分析

Doris 的 FE 和 BE 节点的系统运行日志默认为 INFO 级别。通常可以满足对系统行为的分析和基本问题的定位。但是某些情况下,可能需要开启 DEBUG 级别的日志来进一步排查问题。本文档主要介绍如何开启 FE、BE节点的 DEBUG 日志级别。 不建议将日志级别调整为 WARN 或…

一维二维数组的指针于sizeof和strlen

目录 一维数组于指针的一些题二维数组于指针的一些题 一维数组于指针的一些题 对数组名的理解 数组名表示首元素地址 //两个例外: //sizeof(数组名):表示计算整个数组的大小 //&数组名:这里取的也是整个数组的大小,除了他两以…

ArcGIS、ENVI、InVEST、FRAGSTATS技术教程

专题一 空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 专题二 ArcGIS专题地图制作 2.1专题地图制作规范 2.2 空间数据的准备与处理 2.3 空间数据可视化:地图符号与注…

23.8.9总结

接下来是答辩后的完善: 轮播图在管理员处可以进行修改, 消息处用websocket实现实时更新, 管理员审核界面,未审核的文章不能点赞,评论,收藏,不能用前端页面, 评论用二级评论&…

(el-Table)操作:Element-plus 中Table 表格组件:多选修改成支持单选及表格相关样式的调整

Ⅰ、Element-plus 提供的 Table 表格组件与想要目标情况的对比: 1、Element-plus 提供 Table 组件情况: 其一、Element-ui 自提供的 Table 代码情况为(示例的代码): // Element-plus 自提供的代码: // 此时是使用了 ts 语言环境…

.NET根据类的值进行序列化反序列化操作

前言: 在.NET种,序列化一般常用的方式是使用Newtonsoft.Json进行序列化和反序列化操作,比如创建一个Person类 public class Person {public string Name { get; set; }public int Age { get; set; } }序列化为json // 对象序列化为 JSONPe…