《深度学习》OpenCV 图像边缘检测 算法解析及代码演示

news2024/12/24 7:47:33

目录

一、图像边缘检测

1、什么是边缘检测

2、常用的边缘检测算法

        1)Sobel算子

        2)Scharr 算子

        3)Canny边缘检测算法

        4)Laplacian算子

3、边缘检测流程

        1)预处理

        2)计算梯度

        3)非极大值抑制

        4)双阈值处理

        5)边缘连接

        6)后处理

二、边缘检测算法

1、sobel算子

1)概念

2)公式及卷积核:

3)对x方向边缘检测

运行结果为:

4)对y轴方向进行检测

运行结果:

5)同时对x和y进行检测

6)对单独的x和单独的y方向进行加权处理

运行结果:

2、Scharr算子

1)概念

2)x、y方向卷积核

3)代码实现

运行结果:(图像来源网络,如有侵权,敬请联系删除)

3、Laplacian算子

代码:

运行结果为:

4、Canny算子

1)优点

2)检测流程

        1、图像降噪

        2、梯度计算

        3、非极大值抑制

        4、双阈值边界跟踪

        处理步骤:

3)代码实现

运行结果:


一、图像边缘检测

1、什么是边缘检测

        边缘检测是计算机视觉领域中的一项基本任务,它用于检测图像中物体的边缘边缘是图像中像素值发生突变的地方,通常表示物体的轮廓或者不同区域之间的边界。边缘检测在很多计算机视觉任务中都是必需的,例如目标检测、图像分割和物体识别等。

2、常用的边缘检测算法

        1)Sobel算子

                Sobel算子是一种基于梯度的边缘检测算法。它通过对图像进行卷积操作来计算图像的梯度,并将梯度的大小作为边缘的强度。Sobel算子分为水平和垂直方向,通过对两个方向的梯度进行合并来得到最终的边缘图像。

        2)Scharr 算子

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

    ksize参数表示卷积核的大小。它是一个正奇数,用于指定卷积核的尺寸。

        3)Canny边缘检测算法

                Canny算法是一种多阶段的边缘检测算法。它首先使用高斯滤波器对图像进行平滑处理,然后计算图像的梯度和方向。接下来,通过非极大值抑制双阈值处理来检测边缘,并使用边缘连接算法将断断续续的边缘连接起来。Canny算法能够提取高质量的边缘,并且对噪声有一定的抵抗能力。

        4)Laplacian算子

                Laplacian算子是一种基于二阶导数的边缘检测算法。它通过计算图像的二阶导数来查找图像中的边缘。Laplacian算子对于边缘的宽度和方向不敏感,因此可以检测出比较粗的边缘

3、边缘检测流程

        1)预处理

                对图像进行预处理,例如灰度化、平滑滤波等操作。将图像转换为灰度图像可以简化计算,并且保留了边缘的主要信息。平滑滤波可以降低图像中的噪声,以提高边缘检测的质量。

        2)计算梯度

                使用梯度算子(如Sobel、Prewitt等)计算图像的梯度。梯度表示图像中每个像素的强度变化率,可以用来检测边缘。根据需要,可以分别计算水平和垂直方向的梯度,或者使用其他梯度计算方法。

        3)非极大值抑制

                对梯度图像进行非极大值抑制,以细化边缘。在每个像素点上,检查其梯度方向上的邻域像素,并将中心像素的梯度值保留为局部最大值,其他像素则置为0。这样可以使边缘变得更细。

        4)双阈值处理

                使用阈值来划分强边缘和弱边缘。根据梯度图像中的像素值,设置两个阈值:高阈值和低阈值。高于高阈值的像素被认为是强边缘,低于低阈值的像素被认为是背景。处于高低阈值之间的像素被标记为弱边缘。

        5)边缘连接

                将弱边缘连接到强边缘上。通过在强边缘周围搜索弱边缘,如果弱边缘与强边缘相连,则将其标记为边缘点。这样可以将断断续续的弱边缘连接起来,得到连续的边缘。

        6)后处理

                根据需要进行边缘填充、边缘细化等后处理操作,以强化边缘的质量和连续性。

二、边缘检测算法

1、sobel算子

1)概念

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

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

        

2)公式及卷积核:

3)对x方向边缘检测
import cv2

yuan = cv2.imread('yuan.png')   # 导入图像
cv2.imshow('yuan',yuan)   # 展示图像
cv2.waitKey(0)  # 图像展示时间,参数单位为毫秒,当为0时表示一直展示,键盘点击空格即继续执行代码
#
# x方向的边缘
yuan_x = cv2.Sobel(yuan,-1,dx=1,dy=0)  # 对x方向进行边缘检测,dx=1表示对x方向,dy=0表示不对y轴方向,参数-1表示输出图像将使用与输入图像相同的数据类型来存储像素值
cv2.imshow("yuan_x",yuan_x)
cv2.waitKey(0)
# x方向的边缘,包括负数信息(右端),因为图像的灰度值范围为0*255,负数展示不出来
yuan_x_64 = cv2.Sobel(yuan,cv2.CV_64F,dx=1,dy=0)  # cv2.CV_64F表示将默认的uint8数据类型改为float64,可保存负值
cv2.imshow("yuan_x_64",yuan_x_64)
cv2.waitKey(0)
# x方向的边缘,包括负数信息,进行取绝对值的操作,右端负值信息即可显示
yuan_x_full = cv2.convertScaleAbs(yuan_x_64)  # 使用方法convertScaleAbs将灰度值进行绝对值处理,复制转换成正数
cv2.imshow('yuan_x_full',yuan_x_full)
cv2.waitKey(0)
运行结果为:

4)对y轴方向进行检测

与上述代码类似,只需更改一下方向即可

yuan_y = cv2.Sobel(yuan,-1,dx=0,dy=1)  # x方向不检测,y轴方向检测
cv2.imshow("yuan_y",yuan_y)
cv2.waitKey(0)
# y方向的边缘,包括负数信息(上端)
yuan_y_64 = cv2.Sobel(yuan,cv2.CV_64F,dx=0,dy=1)  # 同样将其更改成浮点型
yuan_y_full = cv2.convertScaleAbs(yuan_y_64)   # 绝对值处理
cv2.imshow("yuan_y_full",yuan_y_full)
cv2.waitKey(0)
运行结果:

5)同时对x和y进行检测

        只需将上述代码更改dx=1,dy=1即可,更改后会有一些不足,如下所示:

6)对单独的x和单独的y方向进行加权处理
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算子的检测

2、Scharr算子

1)概念

        Scharr算子是Sobel算子的改进版本,它使用了类似于Sobel算子的卷积原理,但是在计算中使用了更小的卷积核。

        Scharr算子对图像的高斯平滑操作更加敏感,能够更好地保留边缘的细节信息。相比于Sobel算子,Scharr算子的结果更加准确、清晰。

        Scharr算子有两个卷积核,一个用于计算x方向的边缘响应,另一个用于计算y方向的边缘响应。通过对图像进行这两个方向的卷积操作,可以得到图像中各个像素点处的边缘强度信息。

2)x、y方向卷积核

3)代码实现
zl = cv2.imread('girl.jpg',cv2.IMREAD_GRAYSCALE)  # 导入图像灰度图形式
cv2.imshow('zl',zl)
cv2.waitKey(0)

zl_x_64 = cv2.Scharr(zl,cv2.CV_64F,dx=1,dy=0)  # 对x方向进行处理,将数据类型保存并转换成浮点型
zl_x_full = cv2.convertScaleAbs(zl_x_64)  # 转换为绝对值,负数转换为正数

zl_y_64 = cv2.Scharr(zl,cv2.CV_64F,dx=0,dy=1)  # 同样的,对y轴方向进行处理
zl_y_full = cv2.convertScaleAbs(zl_y_64)  # 绝对值处理

zl_xy_sobel_full = cv2.addWeighted(zl_x_full,1,zl_y_full,1,0)  # 加权处理
cv2.imshow('zl_zy_sobel_full',zl_xy_sobel_full)
cv2.waitKey(0)
运行结果:(图像来源网络,如有侵权,敬请联系删除)

3、Laplacian算子

        不再以x和y的方向计算,而是以圆方向计算变化率。因此不需要Gx+Gy。

代码:
zl = cv2.imread('girl.jpg',cv2.IMREAD_GRAYSCALE)  # 导入灰度图
zl_lap = cv2.Laplacian(zl,cv2.CV_64F)  # 转换成浮点型后直接进行拉普拉斯算子检测
zl_lap_ful = cv2.convertScaleAbs(zl_lap)  # 绝对值处理
cv2.imshow("zl_lap_ful",zl_lap_ful)
cv2.waitKey(0)
运行结果为:

4、Canny算子

1)优点

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

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

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

2)检测流程
        1、图像降噪

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

        2、梯度计算

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

        3、非极大值抑制

                一阶微分在灰度值斜坡过渡时不为零且存在较粗的边缘,较粗的边缘会增大边缘检测的误差,因此需要细化边缘,一种较为常用的方法是非极大值抑制,即在梯度图像中寻找梯度方向上的最大值作为边缘,不是梯度方向上的最大值则抑制为0。因为梯度方向是灰度变化最大的方向。比较梯度图像中每一点的灰度值与梯度方向上至少两个梯度图像像素点灰度值的大小,根据上述大小关系来确定是否保留该点的灰度值。

        4、双阈值边界跟踪

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

        处理步骤:

        fH 和 fL 分别表示 大阈值和小阈值, 由用户设定

3)代码实现
zl = cv2.imread('girl.jpg',cv2.IMREAD_GRAYSCALE)
cv2.imshow('zl',zl)
cv2.waitKey(0)
zl_canny = cv2.Canny(zl,100,150)  # 参数为,图像,其后表示边缘检测的像素值低于100像素的被丢弃,高于150像素的被丢弃
cv2.imshow('zl_canny',zl_canny)
cv2.waitKey(0)
运行结果:

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

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

相关文章

微型直线导轨高精度运行的工作原理

微型导轨是一种用于高精度定位和运动控制的传动装置,常用于微小化、高精密度化的机械设备中,如IC制造设备、半导体设备、高速移载的设备、精密测量、检测仪器、医疗设备、X-Y table,以及高速皮带驱动的设备等小型化设备。 微型导轨的构成相对…

Quartz.Net_持久化

简述 通常而言,Quartz.Net的数据默认是存储在运存中的,换言之:断电即失。所以在默认情况下,当系统重启后,原先的所有任务、触发器、调度器都会失效 为避免上述情况的发生,可以对Quartz.Net进行持久化设置…

支持函数库功能,支持对接豆包、腾讯混元、Amazon Bedrock等模型供应商,MaxKB v1.5.0版本发布

2024年9月2日,MaxKB开源知识库问答系统正式发布v1.5.0版本。 在v1.5.0社区版中,应用编排方面,MaxKB新增函数库功能,支持用户在应用编排时调用函数;模型管理方面,MaxKB新增对豆包、腾讯混元和Amazon Bedroc…

Datawhale AI夏令营 第五期 CV方向 Task2笔记

Task2:建模方案解读与进阶 YOLO介绍 YOLO(You Only Look Once)是一种流行的目标检测算法,于2015年首次提出 。YOLO的核心思想是将目标检测任务转化为一个回归问题,通过单个卷积神经网络(CNN)直…

Linux git的基本使用安装提交 和 gdb的使用

目录 安装git 首次使用git的配置 拉取仓库 步骤1:新建仓库 步骤2:复制仓库地址 步骤3:远端仓库拉取到本地 上传代码 常用指令 安装git sudo apt-get install git # Ubuntu/Debian sudo dnf install git # Fedora sudo yum insta…

惠中科技光伏清洗剂:点亮绿色能源未来

在当今全球追求可持续发展的时代,光伏产业作为清洁能源的重要代表,正发挥着日益关键的作用。而在光伏产业的高效运行中,惠中科技的光伏清洗剂犹如一颗璀璨的明珠,为光伏板的清洁与维护贡献着卓越力量。 一、光伏产业的挑战与需求…

SAP CAP(Cloud Application Programming)知识介绍和学习路径

1. 框架简介 1.1 什么是CAP? CAP(Cloud Application Programming)是SAP推出的一种现代化开发框架,旨在简化和加速云原生应用程序的开发。 CAP框架基于开放标准和技术,如Node.js、Java、OData和SQL,提供了…

删除重复的行

Excel的有7列数字,有些数字整行重复。 ABCDEFG11234567276543213123456741234567511111116111111177777777 要求删掉重复的行。 IJKLMNO1765432127777777 使用 SPL XLL,输入公式: spl("?.group(~).select(~.len()1).conj()",…

Windows、Mac安装配置Nodejs【保姆级教程】

安装配置Nodejs 最近需要使用whistle抓包,发现依赖nodejs环境,同时环境为windows,故在此记录。 1 windows 下载nodejs 官网地址:https://nodejs.org/en/ 下载完成后,双击安装包,开始安装Node.js直接点【…

SOMEIP_ETS_078: Wrong_SOMEIP_Protocol_Version

测试目的: 验证当设备(DUT)接收到一个包含错误协议版本的SOME/IP请求时,是否能够返回错误消息或忽略该请求。 描述 本测试用例旨在检查DUT在处理一个echoUINT8方法的SOME/IP消息时,如果消息中包含的协议版本不正确&…

ARM体系与架构

硬件基础 NOR Flash 和 NAND Flash异同 NOR,Not OR,逻辑是或非门;NAND,Not AND,逻辑是与非门。 两者都是FALSH芯片,断电不丢失。FLASH只能写0不能写1,所以写前都要先擦除。 NOR FLASH 按照块、…

HarmonyOS开发实战( Beta5版)高负载场景下线程设置防止关键线程被打断

场景介绍 在现代软件开发中,多线程或多进程的并发处理已成为常态。在多线程环境中,不同线程执行的任务具有不同的重要性和紧急程度。在高负载情况下,系统资源(如CPU时间)变得非常宝贵,此时如果关键线程&am…

开源-基于J2EE分布式架构的会议管理系统,支持会议资源管理,预订会议,冲突检测,提醒与签到

自20世纪末至21世纪初,数字化和互联网技术的迅猛发展彻底改变了工作方式和商业模式。企业迅速采用电子邮件、即时通讯和在线会议等数字工具以提升沟通效率。 在信息爆炸的时代,工作中面临的信息量剧增,而企业对效率和生产力的要求也日益提高…

用canvas 实现一个 图片 object-fit: cover 模式的效果 ,纯js

先看效果&#xff1a;左侧是原生的object-fit: cover img 右侧是canvas 处理之后的 模仿object-fit: cover 的效果&#xff0c;src 是转换之后的base64 地址 可以结合style样式发现右图并没有object-fit: cover&#xff0c;但是效果与左同。 直接贴代码吧 <!DOCTYPE htm…

2022ICPC香港站

K. Maximum GCD 分析&#xff1a;对 n 任意取模的结果只可能是小于 n/2​ 的正整数。一个序列的最大公约数不会超过这个序列的最小值。 如果全部值都大于等于最小值的两倍&#xff08;或等于最小值&#xff09;&#xff0c;则都可以变成最小值。 反之则取最小值/2。 #includ…

Solidworks笔记

目录 一、Solidworks 1.1 特征命令 1.1.1 镜像 1.1.2 扫描 1.2 报错 1.3 &#xff08;零件&#xff09;属性 1.3.1 材料属性 1.3.2 质心 1.3.3 材料库的创建、保存、导入 1.3.4 查询材料参数的网站 1.3.5 编辑零件颜色 1.3.6 几种颜色 1.3.7 转动惯量查看 …

猫头虎 分享已解决Bug || ModuleNotFoundError: No module named ‘flask‘ 解决方案

猫头虎 分享已解决Bug || ModuleNotFoundError: No module named flask 解决方案 猫头虎 最近收到了一位粉丝的求助&#xff0c;他在进行后端开发时遇到了一个令人头痛的错误&#xff1a;ModuleNotFoundError: No module named flask。这不仅是新手容易遇到的问题&#xff0c;甚…

Linux运维--Firewall防火墙命令以及规则等详解(全)

Linux运维–Firewall防火墙命令以及规则等详解&#xff08;全&#xff09; 在Linux系统中&#xff0c;你可以使用firewalld和iptables来管理和设置防火墙规则。Firewalld是一个动态管理防火墙的工具&#xff0c;而iptables是一个更底层的工具&#xff0c;可以直接配置Linux内核…

算法的学习笔记—数据流中的中位数(牛客JZ41)

&#x1f600;前言 在处理动态数据时&#xff0c;实时计算中位数是一个经典问题。中位数是排序后处于中间位置的数值&#xff0c;数据流中的中位数计算面临两个挑战&#xff1a;首先是数据量的动态变化&#xff0c;其次是需要保持元素的有序性。为了高效地解决这个问题&#xf…

【高校科研前沿】三峡大学黄进副教授等人在环境科学Top期刊JCP发文:人类活动如何在气候变化下影响和降低生态敏感性:以中国长江经济带为例

文章简介 论文名称&#xff1a;How human activities affect and reduce ecological sensitivity under climate change: Case study of the Yangtze River Economic Belt, China&#xff08;人类活动如何在气候变化下影响和降低生态敏感性&#xff1a;以中国长江经济带为例&am…