【OpenCV实现图像梯度,Canny边缘检测】

文章目录

    • 概要
    • 图像梯度
    • Canny边缘检测
    • 小结

概要

OpenCV中,可以使用各种函数实现图像梯度和Canny边缘检测,这些操作对于图像处理和分析非常重要。

图像梯度通常用于寻找图像中的边缘和轮廓。在OpenCV中,可以使用cv2.Sobel()函数计算图像的梯度,该函数可以计算图像在水平和垂直方向上的梯度。梯度的方向和大小可以帮助理解图像中的边缘信息。

Canny边缘检测是一种经典的边缘检测算法,它通过多个步骤来检测图像中的边缘。首先,Canny算法使用Sobel算子计算图像的梯度。然后,它通过非极大值抑制(Non-Maximum Suppression)来细化边缘。接着,Canny算法使用双阈值(Double Thresholding)来检测强边缘和弱边缘,并通过连接强边缘来得到最终的边缘图像。Canny边缘检测在图像处理中被广泛应用,因为它能够准确地检测出图像中的边缘。

在OpenCV中,可以使用cv2.Sobel()函数计算图像的梯度,而Canny边缘检测则可以通过cv2.Canny()函数实现。通过这些函数,可以方便地在OpenCV中实现图像梯度和Canny边缘检测,进而进行各种图像分析和处理任务。

图像梯度

寻找图像梯度,边缘等等。
函数:cv.Sobel(), cv.Scharr(), cvLaplacian() 等等。

Sobel和Scharr导数:
Sobel算子是一种结合了高斯平滑和微分操作的滤波器,因此它对图像中的噪声具有较好的抵抗能力。使用Sobel算子时,可以指定所需导数的方向,通过参数yorder和xorder来确定是垂直方向还是水平方向的导数。此外,还可以通过参数ksize指定核(kernel)的大小。当ksize设为-1时,OpenCV会使用3×3的Scharr滤波器,其结果通常比3×3的Sobel滤波器更为精确。

拉普拉斯导数
它计算了由关系式给出的图像的拉普拉斯算子,其中关系式为
在这里插入图片描述
其中每一个导数都是用 Sobel 导数找到的。如果 ksize = -1,滤波器会使用下面这个内核。

在这里插入图片描述

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt# 读取图像
img = cv.imread('dave.jpg', 0)# 计算拉普拉斯边缘
laplacian = cv.Laplacian(img, cv.CV_64F)# 计算Sobel边缘(x和y方向)
sobelx = cv.Sobel(img, cv.CV_64F, 1, 0, ksize=5)
sobely = cv.Sobel(img, cv.CV_64F, 0, 1, ksize=5)# 绘制原始图像
plt.subplot(2, 2, 1), plt.imshow(img, cmap='gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])# 绘制拉普拉斯边缘图像
plt.subplot(2, 2, 2), plt.imshow(laplacian, cmap='gray')
plt.title('Laplacian'), plt.xticks([]), plt.yticks([])# 绘制Sobel X边缘图像
plt.subplot(2, 2, 3), plt.imshow(sobelx, cmap='gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])# 绘制Sobel Y边缘图像
plt.subplot(2, 2, 4), plt.imshow(sobely, cmap='gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])# 显示图像
plt.show()

在这里插入图片描述
在我们的最后一个例子中,我们使用了Sobel滤波器来检测图像中的边缘。然而,当我们将输出数据类型转换为cv.CV_8U或者np.uint8时,存在一个小问题。在图像中,从黑色到白色的过渡被视为正斜率(它具有正值),而从白色到黑色的过渡被视为负斜率(它具有负值)。因此,当我们将数据类型转换为np.uint8时,所有负斜率都被截断为0,也就是说,我们会错过所有负斜率对应的边缘。

如果我们希望找到所有的边缘,更好的方法是将输出的数据类型保持在一个更高的精度范围内,例如cv.CV_16S、cv.CV_64F等,然后取其绝对值,最后再转换回cv.CV_8U类型。下面的代码演示了这个过程,特别是在处理水平Sobel滤波器时,以及结果的差异。

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt# 读取灰度图像
img = cv.imread('img.png', 0)# 使用Sobel滤波器,输出数据类型为cv.CV_8U
sobelx8u = cv.Sobel(img, cv.CV_8U, 1, 0, ksize=5)# 使用Sobel滤波器,输出数据类型为cv.CV_64F,然后取绝对值并转换为cv.CV_8U
sobelx64f = cv.Sobel(img, cv.CV_64F, 1, 0, ksize=5)
abs_sobel64f = np.absolute(sobelx64f)
sobel_8u = np.uint8(abs_sobel64f)# 显示原始图像、Sobel输出(cv.CV_8U)和Sobel绝对值(cv.CV_64F)
plt.subplot(1, 3, 1), plt.imshow(img, cmap='gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(1, 3, 2), plt.imshow(sobelx8u, cmap='gray')
plt.title('Sobel CV_8U'), plt.xticks([]), plt.yticks([])
plt.subplot(1, 3, 3), plt.imshow(sobel_8u, cmap='gray')
plt.title('Sobel abs(CV_64F)'), plt.xticks([]), plt.yticks([])# 显示图像
plt.show()

在这里插入图片描述

Canny边缘检测

Canny边缘检测的概念
OpenCV函数:cv.Canny()

Canny边缘检测是一种广泛应用的边缘检测算法,由John F. Canny开发而成。该算法包含多个阶段,下面我们将详细介绍每个阶段的过程:

噪声减少:
由于边缘检测对图像中的噪声非常敏感,第一步是通过一个5X5的高斯滤波器对图像进行平滑处理,以去除噪声。寻找图像中的变化(梯度)强度:
接下来,使用Sobel核在水平和垂直方向上对平滑后的图像进行滤波,得到水平方向($G_x$)和垂直方向($G_y$)的一阶导数。通过这两个导数,我们可以计算每个像素点的边缘梯度幅值和方向。梯度方向始终与边缘垂直,通常近似为水平、垂直和两个对角线方向中的一个。

在这里插入图片描述

非极大值抑制:
在得到梯度大小和方向之后,在每个像素点上进行全图扫描。对于每个像素,检查其梯度值是否在相邻像素中是最大的。如果是,保留该值,否则将其置为0。这一步骤产生了一个"薄边"的二值图像。

在这里插入图片描述
滞后阈值:
在此阶段,我们需要确定哪些边缘是真实的,哪些是噪声或者假的。为此,我们使用两个阈值,minVal(最小值)和maxVal(最大值)。所有强度大于maxVal的边缘被视为真正的边缘,低于minVal的被丢弃。介于两者之间的边缘会基于连通性来判断是否为边缘。如果它们与确定的边缘相连,则保留,否则被抛弃。这一步骤也基于边缘是长线的假设来去除小的像素噪声。
在这里插入图片描述
边缘 A 因为在 maxVal 上面,所以是肯定的边缘。尽管边缘 C 的位置在 maxVal 下面,但是因为它和边缘 A 相连接,所以我们认为它也是个有效边缘,如此得到了一条完整的曲线。但是对于边缘 B 来说,哪怕它在 minVal 上面,和边缘 C 处在同一个区域上,可是它并不和任何一条有效边缘连接,所以会被丢弃。所以,为了得到正确的结果,我们需要确定好 minVal 和 maxVal 的值。

最终,经过这些步骤,我们就能得到一条完整的边缘在图像中。

OpenCV中的Canny边缘检测

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt# 读取灰度图像
img = cv.imread('img.png', 0)# 使用Canny边缘检测算法,阈值设置为100和200
edges = cv.Canny(img, 100, 200)# 显示原始图像和Canny边缘检测结果
plt.subplot(121), plt.imshow(img, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])plt.subplot(122), plt.imshow(edges, cmap='gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])plt.show()

在这里插入图片描述

小结

图像梯度:

OpenCV提供了多种方法来计算图像的梯度,包括Sobel、Scharr和拉普拉斯滤波器。
Sobel算子是一种联合高斯平滑和微分操作的滤波器,可以计算图像在水平和垂直方向上的梯度。
使用Sobel算子时,你可以指定所需导数的方向(水平或垂直)以及核的大小。
拉普拉斯滤波器用于计算图像的拉普拉斯算子,通过将图像的二阶导数与Sobel导数相关联来实现。

Canny边缘检测:

Canny边缘检测是一种多阶段算法,用于检测图像中的边缘。
第一阶段是噪声减少,通常通过应用高斯滤波器来实现,以平滑图像并减少噪声。
第二阶段是计算图像的梯度,通常使用Sobel滤波器,以获得图像的水平和垂直梯度。
接下来进行非极大值抑制,以去除可能不构成边缘的像素,仅保留边缘像素。
最后一个阶段是滞后阈值,需要设置两个阈值(minVal和maxVal),以确定哪些边缘是真实的。根据这些阈值,边缘可能被分类为强边缘、弱边缘或非边缘,并进行相应的处理。

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

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

相关文章

都是80m²小户型,凭啥她家那么好看!福州中宅装饰,福州装修

杨桥新苑 本案来自杨桥新苑的住宅, 质朴弥漫在80㎡的小家, 自然淡雅的木纹,精炼的玄关隔断, 简约的设计里传达着中式的静谧风雅, 简练的空间加入中国元素, 让人从进门开始就沾染一丝艺术气息。 风格&a…

瑞禧生物分享~今天是 碲化银粉体 Ag2Te CAS:12002-99-2

碲化银粉体 Ag2Te CAS:12002-99-2 纯度:99% 仅用于科研 储藏条件:冷藏-20℃ 简介:碲化银是一种无机化合物,化学式是Ag2Te。它是一种单斜晶体,并以矿物的形式存在于自然界中。化学计量的碲化银具有n型半导…

AI:50-基于深度学习的柑橘类水果分类

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…

【Linux】Nignx及负载均衡动静分离

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《微信小程序开发实战》。🎯&#x1f3a…

系列四、全局配置文件mybatis-config.xml

一、全局配置文件中的属性 mybatis全局配置中的文件非常多,主要有如下几个: properties(属性)settings(全局配置参数)typeAliases(类型别名)typeHandlers(类型处理器&am…

服务上千家企业,矩阵通2.0重磅上线,全链路管理新媒体矩阵

自上线以来 矩阵通已服务了上千家企业级客户 覆盖汽车、家居、媒体、金融、教育等多个行业 矩阵通1.0时代 我们以“数据”为基座打造出10功能 帮助企业轻松管理新媒体矩阵 实现账号管理、数据分析、竞对监测、 人员考核、风险监管等需求 而现在 矩阵通2.0重磅上线 新增…

华纳云:centos系统中怎么查看cpu信息?

在CentOS系统中,我们可以使用一些命令来查看CPU的详细信息。下面介绍几个常用的命令: 1. lscpu lscpu命令可以显示CPU的架构、型号、核心数、线程数、频率等信息。 # lscpu 执行以上命令后,会输出类似以下内容: 2. cat /proc/…

配置OpenCV

Open CV中包含很多图像处理的算法,因此学会正确使用Open CV也是人脸识别研究的一项重要工作。在 VS2017中应用Open CV,需要进行手动配置,下面给出在VS2017中配置Open CV的详细步骤。 1.下载并安装OpenCV3.4.1与VS2017的软件。 2.配置Open CV环…

07、vue : 无法加载文件 C:\Users\JH\AppData\Roaming\npm\vue.ps1,因为在此系统上禁止运行脚本。

目录 问题解决: 问题 vue : 无法加载文件 C:\Users\JH\AppData\Roaming\npm\vue.ps1,因为在此系统上禁止运行脚本。 在使用 VSCode 时,创建 Vue 项目报的错 创建不了 Vue 项目 解决: 因为在此系统上禁止运行该脚本&#xff0…

【排序算法】 计数排序(非比较排序)详解!了解哈希思想!

🎥 屿小夏 : 个人主页 🔥个人专栏 : 算法—排序篇 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言🌤️计数排序的概念☁️什么是计数排序?☁️计数排序思想⭐绝对…

四川天蝶电子商务有限公司:短视频运营怎么样?

短视频是一种以短小精悍的内容来吸引用户的新型媒体形式,近年来在社交网络平台上迅速走红,成为当今互联网世界的新宠。然而,要想成功运营短视频,需要借助一系列的策略和技巧,通过精心的规划和执行,才能够吸…

后端开发基本步骤(未完成继续写中)

1.使用spring initializr创建项目 注意&#xff1a;然后低下提供的依赖可用可不用&#xff0c;先不用&#xff0c;后边Maven统一配置依赖&#xff0c; 2.导入依赖 <!-- web --> <dependency><groupId>org.springframework.boot</groupId><artifa…

使用IO完成端口实现简单回显服务器

说明 使用IO完成端口实现简单回显服务器&#xff0c;因为是测试用的&#xff0c;所以代码很粗糙。 提醒 使用的是ReadFile、WriteFile来实现Overlapped IO&#xff0c;正式场合应该用WSARecv、WSASend&#xff0c;原因&#xff1a;来自《Windows网络编程技术》 8.2.5节 在这里…

使用Docker搭建一个“一主两从”的 Redis 集群(超详细步骤)

目录 1、Redis 单机版安装1.1 拉取 Redis1.2 创建数据卷目录1.3 修改 redis.conf1.4 启动 Redis 容器1.5 进入容器连接 Redis 2、Redis 一主两从集群搭建2.1 复制三份 redis.conf2.2 启动 master2.3 启动 两个redis slave2.4 三者关系查看2.5 数据测试 1、Redis 单机版安装 1.…

uniapp生命周期

uniapp生命周期包括应用生命周期、页面生命周期和组件生命周期&#xff1b; 1、应用生命周期 app.vue/uvue是uni-app的朱组件。所有页面都是在app.vue下进行切换&#xff0c;是应用入口文件。但app.vue本身不是页面&#xff0c;这里补鞥编写视图元素&#xff0c;也就没有。 这…

Recommender System复习(考试向)

Recommender System Review OverviewCollaborative Filtering基于用户的CF&#xff08;User CF&#xff09;基于物品的CF&#xff08;Item CF&#xff09;Similarity CalculationBias in CF Evaluation of Recommender SystemFactorization MachinesLatent factor modelLFM算法…

Day 5 登录页及路由 (三) 基于axios的API调用

系列文章目录 本系列记录一下通过Abp搭建后端&#xff0c;VueElement UI Plus搭建前端&#xff0c;实现一个小型项目的过程。 Day 1 Vue 页面框架Day 2 Abp框架下&#xff0c;MySQL数据迁移时&#xff0c;添加表和字段注释Day 3 登录页以及路由 (一&#xff09;Day 4 登录页以…

为什么树莓派安装Ubuntu的时候无法通过有线(网线)连网

这个东西从软件角度有很多解释&#xff0c;但是我这里遇到的情况是&#xff1a; 因为一个标注2A但是实际电流虚标的充电头浪费了我2天的时间。 也即是说&#xff1a;如果你的树莓派无法通过网线联网&#xff0c;很有可能是因为供电不足。因为一个新的树莓派一般不会有故障&am…

XUbuntu22.04之解决桌面突然放大,屏幕跟着鼠标移动问题(一百九十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

瑞禧生物分享纳米粉体~二硫化钼粉体 MoS2 纯度:99% 纳米二硫化钼(MoS2)

二硫化钼粉体 名称&#xff1a;二硫化钼粉体 纯度&#xff1a;99% 外观&#xff1a;粉末 纳米二硫化钼(MoS2)粉体硫化钼粉体 二硫化铝化学性质稳定、热稳定性好 、摩擦系数低 、润滑作用优 良且在较为苛 刻的工作环境下能保持 良好的摩擦性能因此二硫化铝被广泛应用于固体润…