OpenCV计算机视觉 05 图像边缘检测(Sobel算子、Scharr算子、Laplacian算子、Canny边缘检测)

图像边缘检测

边缘检测是图形图像处理、计算机视觉和机器视觉中的一个基本工具,通常用于特征提取和特征检测,旨在检测一张数字图像中有明显变化的边缘或者不连续的区域。

yuan=cv2.imread('yuan.png')
cv2.imshow('yuan',yuan)
cv2.waitKey(0)
yuan_x=cv2.Sobel(yuan,-1,dx=1,dy=0)
cv2.imshow('yuan_x',yuan_x)
cv2.waitKey(0)
yuan_x_64=cv2.Sobel(yuan,cv2.CV_64F,dx=1,dy=0)
cv2.imshow('yuan_x_64',yuan_x_64)
cv2.waitKey(0)
yuan_x_full=cv2.convertScaleAbs(yuan_x_64)
cv2.imshow('yuan_x_full',yuan_x_full)
cv2.waitKey(0)
​
yuan_y=cv2.Sobel(yuan,-1,dx=0,dy=1)
cv2.imshow('yuan_y',yuan_y)
cv2.waitKey(0)
yuan_y_64=cv2.Sobel(yuan,cv2.CV_64F,dx=0,dy=1)
cv2.imshow('yuan_y_64',yuan_y_64)
cv2.waitKey(0)
yuan_y_full=cv2.convertScaleAbs(yuan_y_64)
cv2.imshow('yuan_y_full',yuan_x_full)
cv2.waitKey(0)
​
yuan_xy=cv2.Sobel(yuan,-1,dx=1,dy=1)
cv2.imshow('yuan_xy',yuan_xy)
cv2.waitKey(0)
yuan_xy_full=cv2.addWeighted(yuan_x_full,1,yuan_y_full,1,0)
cv2.imshow('yuan_xy_full',yuan_xy_full)
cv2.waitkey(0)
Sobel算子

Sobel 算子是一种离散的微分算子,该算子结合了高斯平滑和微分求导运算。该算子利用局部差分寻找边缘,计算所得的是一个梯度的近似值。

Sobel算子包含2组3×3的矩阵,分别为横向和纵向模板,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。

函数介绍

cv2.Sobel(src, ddepth, dx, dy[, ksize[, scale[, delta[, borderType]]]])

src:输入图像

ddepth: 输出图像的深度(可以理解为数据类型),-1表示与原图像相同的深度

dx,dy:当组合为dx=1,dy=0时求x方向的一阶导数,当组合为dx=0,dy=1时求y方向的一阶导数(如果同时为1,通常效果不佳)

ksize:(可选参数)Sobel算子的大小,必须是1,3,5或者7,默认为3。

Scharr算子

Scharr 算子是 Soble 算子在 ksize=3 时的优化,与 Soble 的速度相同,且精度更高。Scharr 算子与 Sobel 算子的不同点是在平滑部分,其中心元素占的权重更重,相当于使用较小标准差的高斯函数,也就是更瘦高的模板。

函数介绍

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

src:输入图像

ddepth:输出图片的数据深度,由输入图像的深度进行选择

dx:x 轴方向导数的阶数

dy:y 轴方向导数的阶数

Laplacian算子

函数介绍

cv2.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])

参数说明:

src:输入图像,可以是灰度图像,也可以是多通道的彩色图像

ddepth:输出图片的数据深度:

ksize:计算二阶导数滤波器的孔径大小,必须为正奇数,可选项

scale:缩放比例因子,可选项,默认值为 1

delta:输出图像的偏移量,可选项,默认值为 0

imge=cv2.imread('img.png',cv2.IMREAD_GRAYSCALE)
img=cv2.resize(imge, (600, 600))
# sobal算子
img_x_64=cv2.Sobel(img,cv2.CV_64F,dx=1,dy=0)
img_x_full=cv2.convertScaleAbs(img_x_64)
img_y_64=cv2.Sobel(img,cv2.CV_64F,dx=0,dy=1)
img_y_full=cv2.convertScaleAbs(img_y_64)
img_xy_sobel_full=cv2.addWeighted(img_x_full,1,img_y_full,1,0)
cv2.imshow('img_xy_sobel_full',img_xy_sobel_full)
cv2.waitKey(0)
#Scharr算子
img_x_64=cv2.Scharr(img,cv2.CV_64F,dx=1,dy=0)
img_x_full=cv2.convertScaleAbs(img_x_64)
img_y_64=cv2.Scharr(img,cv2.CV_64F,dx=0,dy=1)
img_y_full=cv2.convertScaleAbs(img_y_64)
img_xy_scharr_full=cv2.addWeighted(img_x_full,1,img_y_full,1,0)
cv2.imshow('img_xy_scharr_full',img_xy_scharr_full)
cv2.waitKey(0)
#拉普拉斯
img_lap=cv2.Laplacian(img,cv2.CV_64F)
cv2.imshow('img_lap',img_lap)
cv2.waitKey(0)

Canny边缘检测

函数介绍

cv.Canny( image, threshold1, threshold2[, apertureSize[, L2gradient]])

image 为输入图像。

threshold1 表示处理过程中的第一个阈值。fL

threshold2 表示处理过程中的第二个阈值。fH

Canny边缘检测的优点:

  • 低错误率。因为一般的边缘检测算子可能存在检测到伪边缘的情况,因此Canny算法检测到的边缘尽可能地是真实的边缘。

  • 较好地定位边缘点。由检测器标记的边缘点与真实边缘点中心尽可能地接近。

  • 单一的边缘响应。图像中的边缘只标记出一次。

Canny边缘检测分为4个部分

1、图像降噪 2、梯度计算 3、非极大值抑制 4、双阈值边界跟踪

  1. 图像降噪

    图像去噪是进行边缘检测的第一步,通过去噪可以去除图像中的一些噪点,从而使边缘检测时免受噪点干扰。高斯滤波。

  2. 梯度计算

    要进行边缘检测,就需要得到图像梯度信息,根据图像的梯度幅值和梯度方向来确定边缘,一般均采用sobel算子对图像进行梯度幅值与梯度方向计算。

  3. 非极大值抑制

    一阶微分在灰度值斜坡过渡时不为零且存在较粗的边缘,较粗的边缘会增大边缘检测的误差,因此需要细化边缘,一种较为常用的方法是非极大值抑制

    非极大值抑制:即在梯度图像中寻找梯度方向上的最大值作为边缘,不是梯度方向上的最大值则抑制为0。因为梯度方向是灰度变化最大的方向。比较梯度图像中每一点的灰度值与梯度方向上至少两个梯度图像像素点灰度值的大小,根据上述大小关系来确定是否保留该点的灰度值。

  4. 双阈值边界跟踪

    双阈值处理就是根据实际情况需要设置一个灰度高阈值和一个灰度低阈值对NMS后的图像进行过滤,使得得到的边缘尽可能是真实的边缘。

imge=cv2.imread('img.png',cv2.IMREAD_GRAYSCALE)
img=cv2.resize(imge, (500, 500))
cv2.imshow('img_original',img)
cv2.waitKey(0)
img_canny=cv2.Canny(img,100,150)
cv2.imshow('img_canny_100-150',img_canny)
cv2.waitKey(0)
img_canny=cv2.Canny(img,200,250)
cv2.imshow('img_canny_200-250',img_canny)
cv2.waitKey(0)

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

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

相关文章

【C++】P2550 [AHOI2001] 彩票摇奖

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述输入格式:输出格式:输入输出样例: 💯题解思路1. 问题解析 💯我的实现实现逻辑问题分析 💯老…

【调试记录】在CARLA中插入可以播放视频的组件

〇、问题描述 做实验验证的时候,需要在CARLA仿真环境中添加一个可以播放视频的功能,查了很多现有的实验,基本都是插入图像,而对于插入视频,实现的方法就很麻烦了。一开始考虑的是直接用射影变换进行叠加,计…

SQL—Group_Concat函数用法详解

SQL—Group_Concat函数用法详解 在LC遇见的一道很有趣的SQL题,有用到这个函数,就借这道题抛砖引玉,在此讲解一下group_concat函数的用法。🤣 GROUP_CONCAT([DISTINCT] expression [ORDER BY expression] [SEPARATOR separator])…

深入解析 Linux 设备树中的引脚控制(pinctrl)二

在嵌入式开发中,设备树(Device Tree)是描述硬件设备和系统拓扑的重要结构。而在 Linux 内核中,引脚控制(pinctrl)是一个关键的硬件资源管理部分,负责管理和配置设备的引脚(GPIO、I2C、SPI 等接口)功能和状态。设备树通过描述这些引脚的特性,指导 Linux 内核如何正确地…

MySQL(六)MySQL 案例

1. MySQL 案例 1.1. 设计数据库 1、首先根据相关业务需求(主要参考输出输入条件)规划出表的基本结构   2、根据业务规则进行状态字段设计   3、预估相关表的数据量进行容量规划   4、确定主键   5、根据对相关处理语句的分析对数据结构进行相应的变更。   设计表的时…

后台管理系统动态面包屑Breadcrumb组件的实现

在后管理系统开发中,面包屑导航是一个非常常见的功能,通常是根据当前的 url 自动生成面包屑导航菜单,当跳转路由发生变化时,面包屑导航都会随之发生变化,即动态面包屑。 要完成动态面包屑我们需要制作一个动态数组&am…

4.1.2 栈和队列(一)

文章目录 栈的定义栈的基本运算栈的存储结构栈的应用表达式求值 栈和队列的逻辑结构与线性表相同,但是其运算受到限制,统称为运算受限的线性表。 栈, 先进后出 队列,先进先出 栈的定义 栈顶,唯一能操作端 栈底&#xf…

基于氢氧燃料电池的分布式三相电力系统Simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于氢氧燃料电池的分布式三相电力系统Simulink建模与仿真,仿真输出燃料电池中氢氧元素含量变化以及生成的H2O变化情况。 2.系统仿真结果 3.核心程序与模型 版本…

k620老显卡,装cuda.等。

CUDA安装教程(超详细)-CSDN博客 1.下载支持12.0以上的驱动 NVIDIA RTX Driver Release 550 R550 U12 (553.50) | Windows 11 解压。安装。一路下一步。查看结果 2.下载 cuda CUDA Toolkit Archive | NVIDIA Developer 安装cuda时,第一次…

【数学建模笔记】评价模型-基于熵权法的TOPSIS模型

视频课地址:https://www.bilibili.com/video/BV1eRyVYUEhg 本系列文章和课程一样,只使用Python实现,好久没玩数学建模了 国赛中不能再用TOPSIS,可以做辅助算法。 1. 算法原理 熵权TOPSIS方法是一种结合熵权法和TOPSIS的决策分析…

当今世界如何减少暴戾之气和矛盾纷争

《消暴戾、减纷争》(一) 暴戾之气常见于陌生人之间、纷争矛盾常见于与陌生人、同事、朋友、家人之间,总之就是一切人际关系、交际 常见案例:路怒症、住户与外卖小哥的纷争,同事、朋友、家人之间的矛盾 小吵还好&#…

【情感】程序人生之情感关系中的平等意识(如何经营一段长期稳定的关系 沸羊羊舔狗自查表)

【情感】程序人生之情感关系中的平等意识(如何经营一段长期稳定的关系 & 沸羊羊舔狗自查表) 文章目录 1、情感关系中的平等意识2、如何经营一段长期稳定的关系(避免左倾 | 敬畏与担当)3、沸羊羊/舔狗自查表(避免右…

让css设置的更具有合理性

目录 一、合理性设置宽高 二、避免重叠情况,不要只设置最大宽 三、优先使用弹性布局特性 四、单词、数字换行处理 五、其他编码建议 平常写css时,除了遵循一些 顺序、简化、命名上的规范,让css具有合理性也是重要的一环。 最近的需求场…

Go小技巧易错点100例(二十一)

本篇内容: errors.Is方法与两种方式进行error比较 在Go语言中,处理错误(error 类型)时,errors.Is 和直接使用 操作符进行错误比较,虽然看起来都用于比较错误,但实际上它们有着根本的不同。这主…

【服务器项目部署】✈️将本地项目部署到服务器(二)!

目录 👋前言 👀一、功能调整 🌱二、服务部署 💞️三、代码调整 🍻四、章末 👋前言 小伙伴们大家好,上篇文章本地实践了如何将本地项目部署到服务器上,从服务器的选择、服务器环境…

Kafka消息队列

目录 前置内容常用脚本说明和示例描述与定义部分术语说明两种模式点对点模式发布订阅模式 topic主题命令行操作指令生产者Broker消费者 前置内容 队列: 先进先出 应用: 大数据中主要用于离线和实时处理 流程: Flume正常获取数据,…

如何使用 Ansys OptiSlang 同时运行多个参数化设计研究

了解如何通过使用 OptiSLang 同时运行多个参数化设计研究来提高工作效率。 了解参数化设计研究的重要性 参数化设计研究在工程和设计过程中起着至关重要的作用。通过改变输入参数,工程师可以探索不同设计选择的效果,并优化其设计以满足性能、成本或其他…

Nginx (40分钟学会,快速入门)

一、什么是Nginx ? 可以做什么 ? Nginx 是高性能的 HTTP 和反向代理的 web 服务器,处理高并发能力是十分强大的,能经受高负载的考验,有报告表明能支持高达50000个并发的连接数.Nginx特点就是内存少,并发能力强。事实上…

【Rust自学】10.6. 生命周期 Pt.2:生命周期的语法与例子

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 10.6.1. 生命周期标注语法 生命周期的标注并不会改变引用的生命周期长度。如果某个函数它制定了泛型生命周期参数,那么它就可…