《OpenCV计算机视觉》—— 图像边缘检测

文章目录

  • 一、图像边缘检测概述
  • 二、常见的图像边缘检测算法(简单介绍)
    • 1.sobel算子
    • 2.Scharr算子
    • 3.Laplacian算子
    • 4.Canny算子
  • 三、代码实现

一、图像边缘检测概述

  • 图像边缘检测是一种重要的图像处理技术,用于定位二维或三维图像中对象的边缘。这些边缘通常是图像中亮度或灰度值发生显著变化的地方,对应着物体的轮廓不同区域的边界
  • 图像边缘检测在图像分割、目标识别、图像分析等领域具有广泛的应用
  • 图像边缘检测的目的
    • 特征提取:边缘是图像中重要的特征信息,通过边缘检测可以提取出这些特征,为后续处理如图像分割、目标识别等提供基础。
    • 图像简化:边缘检测后的图像更为简洁,去除了大量冗余的像素点,有助于减少计算量,提高处理速度,并使图像更易于分析和理解。
    • 结构分析:边缘检测有助于分析图像中的结构信息,如物体的形状、大小、方向等,这些信息对于图像理解、场景重建等任务至关重要。
    • 提升图像质量:边缘检测可以突出图像中的轮廓信息,使图像更加清晰、易于观察,特别是在医学影像分析、遥感图像处理等领域尤为重要。
    • 促进后续处理:边缘检测是许多图像处理任务的预处理步骤,如图像分割、目标检测、目标跟踪等,通过边缘检测可以更容易地识别出图像中的目标对象,并为后续处理提供准确的定位信息。
  • 图像边缘检测的基本步骤
    • 滤波:边缘检测算法主要基于图像强度的一阶和二阶导数,但这些导数对噪声非常敏感。因此,滤波是边缘检测前的必要步骤,以减少噪声对边缘检测结果的影响。常用的滤波器有高斯滤波器,它通过离散化的高斯函数对图像进行平滑处理。
    • 增强:增强算法的目的是将图像中灰度有显著变化的点(即潜在的边缘点)凸显出来。一般通过计算梯度幅值来完成,梯度反映了亮度变化的强度和方向。
    • 检测:在增强后的图像中,需要进一步检测边缘点。常用的方法是通过阈值化来检测边缘点,即设定一个或多个阈值,将梯度幅值大于阈值的点视为边缘点。
    • 定位:在检测到边缘点后,需要进一步确定边缘的精确位置。这通常涉及到对边缘点的进一步处理和分析,如亚像素边缘定位等,以提高边缘检测的精度。
    • 连接:在某些情况下,由于噪声、光照变化等因素的影响,检测到的边缘点可能会呈现为断开的片段。因此,需要通过一定的算法(如霍夫变换、轮廓跟踪等)将这些断开的边缘片段连接起来,形成完整的边缘轮廓。

二、常见的图像边缘检测算法(简单介绍)

1.sobel算子

  • Sobel 算子是一种离散的微分算子,该算子结合了高斯平滑微分求导运算。该算子利用局部差分寻找边缘,计算所得的是一个梯度的近似值。
  • Sobel算子包含2组3×3的矩阵,分别为横向(Y方向)纵向(X方向)模板,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。
  • 如下图所示卷积核沿着X和Y方向进行卷积
    在这里插入图片描述

2.Scharr算子

  • Scharr 算子是 Soble 算子在 ksize=3 (卷积核为3*3)时的优化,卷积核比Sobel算子更精细,与 Soble 的速度相同,且精度更高。Scharr 算子与 Sobel 算子的不同点是在平滑部分,其中心元素占的权重更重,相当于使用较小标准差的高斯函数,也就是更瘦高的模板。
  • 卷积核如下:
    在这里插入图片描述
  • 以上两种算子的检测过程如下图所示
    在这里插入图片描述

3.Laplacian算子

  • Laplacian算子不再以x和y的方向计算,而是以圆方向计算变化率。因此不需要Gx+Gy。
  • 卷积核类似下图:
    在这里插入图片描述

4.Canny算子

  • Canny算子是一种多步骤的边缘检测算法,它通过图像平滑(降噪)计算梯度幅值和方向非极大值抑制以及双阈值处理等多个步骤来提取边缘信息
  • 因此Canny算子具有高精度低误检率抗噪声能力强的特点,是许多图像处理任务中边缘检测的首选算法
    • 图像降噪:使用高斯滤波器对输入图像进行平滑处理,以消除图像中的噪声和细节。高斯滤波器是一种常用的平滑滤波器,它通过卷积操作降低图像噪声。
    • 计算梯度幅值和方向:对平滑后的图像应用Sobel(或Prewitt)算子,计算每个像素点的梯度幅值和方向。梯度可以反映像素值的变化情况,是边缘检测的重要依据。
    • 非极大值抑制:在梯度图像上,对每个像素点在其梯度方向上进行比较,并保留局部最大值点,抑制非边缘像素。这一步的目的是细化边缘,确保边缘的宽度为单个像素。
    • 双阈值处理:根据设定的高阈值和低阈值,将梯度图像中的像素点分为强边缘、弱边缘和非边缘三个部分。高阈值用于确定边缘候选点,而低阈值用于连接边缘。

三、代码实现

  • 对一张图片分别用以上不同的四种算子方法进行实现

    import cv2""" 读取图片 """
    M = cv2.imread('kobe.jpg', cv2.IMREAD_GRAYSCALE)  # 读取图片并转换为灰度图
    MB = cv2.resize(M, dsize=None, fx=0.4, fy=0.4)  # 对图片大小进行调整(可选)""" Sobel算子 """
    """
    cv2.Sobel(src, ddepth, dx, dy[,ksize[, scale[, delta[, borderType]]]])# 参数:
    src:输入图像
    ddepth: 输出图像的深度(可以理解为数据类型),-1表示与原图像相同的深度
    dx,dy:当组合为dx=1,du=0时求x方向的一阶导数,当组合为dx=0,dy=1时求y方向的一阶导数(如果同时为1,通常效果不佳)
    ksize:(可选参数)Sobel算子的大小,必须是1,3,5或者7(奇数),默认为3。
    """
    # cv2.Sobel函数来分别计算水平和垂直的梯度
    # 用cv2.CV_64F作为输出图像的深度时,结果可能会包含负数
    MB_x_64 = cv2.Sobel(MB, cv2.CV_64F, dx=1, dy=0)
    MB_y_64 = cv2.Sobel(MB, cv2.CV_64F, dx=0, dy=1)
    # 使用cv2.convertScaleAbs函数将结果转换为可显示的格式(即取绝对值后转换为8位无符号整数)
    MB_x_full = cv2.convertScaleAbs(MB_x_64)
    MB_y_full = cv2.convertScaleAbs(MB_y_64)
    # 使用cv2.addWeighted来结合水平和垂直梯度,这是计算梯度幅度(而非方向)的一种常用方法
    # 权重都设置为0.5,意味着水平和垂直梯度对最终结果的贡献是相同的
    MB_xy_full_Sobel = cv2.addWeighted(MB_x_full, 0.5, MB_y_full, 0.5, 0)  # 可以更改权重得到不同的效果""" Scharr算子 """
    """
    cv.Scharr(src, ddepth, dx, dyl, dst[, scalel, deltal, borderType]]]])
    src:输入图像
    ddepth:输出图片的数据深度,由输入图像的深度进行选择
    dx: x 轴方向导数的阶数
    dy: y 轴方向导数的阶数
    """
    MB_x_64 = cv2.Scharr(MB, cv2.CV_64F, dx=1, dy=0)
    MB_y_64 = cv2.Scharr(MB, cv2.CV_64F, dx=0, dy=1)
    MB_x_full = cv2.convertScaleAbs(MB_x_64)
    MB_y_full = cv2.convertScaleAbs(MB_y_64)
    MB_xy_full_Scharr = cv2.addWeighted(MB_x_full, 0.5, MB_y_full, 0.5, 0)""" Laplacian算子 """
    """
    cv2.Laplacian(src, ddepth[, dst[, ksize[, scalel, delta[, borderType]]]]])
    参数说明:
    src:输入图像,可以是灰度图像,也可以是多通道的彩色图像
    ddepth:输出图片的数据深度,由输入图像的深度进行选择
    ksize:计算二阶导数滤波器的孔径大小,必须为正奇数,可选项
    scale:缩放比例因子,可选项,默认值为 1
    delta:输出图像的偏移量,可选项,默认值为 0
    """
    MB_lap = cv2.Laplacian(MB, cv2.CV_64F)
    MB_full_Laplacian = cv2.convertScaleAbs(MB_lap)""" Canny算子 """
    """
    cv.Canny( image, threshold1, threshold2[, apertureSize[, L2gradient]])
    image 为输入图像
    threshold1 表示处理过程中的第一个阈值。fL --> 低
    threshold2 表示处理过程中的第二个阈值。fH --> 高
    """
    MB_canny = cv2.Canny(MB, 100, 150)  # 设置高低阈值""" 显示结果 """
    cv2.imshow('MB', MB)  # 原图
    cv2.imshow('MB_xy_full_Sobel', MB_xy_full_Sobel)  # Sobel算子
    cv2.imshow('MB_xy_full_Scharr', MB_xy_full_Scharr)  # Scharr算子
    cv2.imshow('MB_full_Laplacian', MB_full_Laplacian)  # Laplacian算子
    cv2.imshow('MB_canny', MB_canny)  # canny算子# 等待任意键按下后关闭所有窗口
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
  • 结果如下:

    • 原图
      在这里插入图片描述
    • sobel算子(左)和Scharr算子(右)结果图
      在这里插入图片描述
    • Laplacian算子(左)和Canny算子(右)结果图
      在这里插入图片描述
  • 由结果可以看出四个算子中,Canny算子边缘检测的结果是最好的

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

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

相关文章

一款企业网盘,支持多种文件存储方式如FTP,SFTP,MINIIO等以及跨平台管理(附源码)

前言 随着数字化转型的推进,企业越来越依赖于云端技术来存储、管理和共享重要的业务文件。传统的本地存储处理方案虽然可靠,但在灵活性、可访问性和协作方面显得力不从心。尤其在远程工作变得日益普遍的今天,如何高-效地管理分散团队之间的文…

Java学习Day40:大战亢金龙!(spring框架之AOP)

AOP(面向切面变成):不改变原有代码的情况下,对代码进行功能添加 1.一些概念 抽取出的方法:通知 原始方法:成为连接点(可以是程序执行中的任意位置),对应原始的一个个方…

NVDLA专题14:Runtime environment-用户模式驱动

运行时环境(runtime environment)包括在兼容的NVDLA硬件上运行编译神经网络的软件。 它由两部分组成: 用户模式驱动(User Mode Driver, UMD): 这是应用程序的主接口,正如Compile library中所详述的,对神经…

网络药理学:1、文章基本思路、推荐参考文献、推荐视频

文章基本思路 选择一味中药或者中药复方(常见的都是选择一味中药,如:大黄、银柴胡等),同时选择一个要研究的疾病(如食管癌等)获得中药的主要化学成分或者说活性成分(有时候也以化合…

第146天:内网安全-Web权限维持各语言内存马Servlet-api类Spring类Agent类

目录 前置知识及资源 案例一: 权限维持-Web-内存马-PHP 案例二: 权限维持-Web-内存马-Python 案例三: 权限维持-Web-内存马-JAVA 案例四: 权限维持-Web-内存马-哥斯拉&冰蝎 哥斯拉 ​编辑 冰蝎 前置知识及资源 什么是…

程序员如何写笔记并整理资料?

整理笔记 word。没错,我也看了网上一大堆软件,还有git管理等等。个人认为如果笔记只是记录个人的经验积累,一个word就够了,那些notepad,laTex个人觉得不够简练。word。 1.word可以插入任何文件附件(目前最大的word 20…

C++笔记---list

1. list的介绍 list其实就是就是我们所熟知的链表(双向循环带头结点),但其是作为STL中的一个类模板而存在。 也就是说,list是可以用来存储任意类型数据的顺序表,既可以是内置类型,也可以是自定义类型&…

六西格玛绿带培训多少钱

在探讨“六西格玛绿带培训多少钱”这一主题时,我们不得不深入了解六西格玛方法论在企业质量管理中的重要作用,以及绿带培训作为这一方法论推广和应用的关键环节。六西格玛,作为一种以数据驱动的管理哲学和方法论,旨在通过减少缺陷…

深入理解Java中的clone对象

目录 1. 为什么要使用clone 2. new和clone的区别 3. 复制对象和复制引用的区别 4.浅克隆和深克隆 5. 注意事项 1. 为什么要使用clone 在实际编程过程中,我们常常遇到这种情况:有一个对象 A,需要一个和 A 完全相同新对象 B,并…

ModuleNotFoundError: No module named ‘keras.layers.core‘怎么解决

问题 ModuleNotFoundError: No module named keras.layers.core,如图所示: 如何解决 将from keras.layers.core import Dense,Activation改为from tensorflow.keras.layers import Dense,Activation,如图所示: 顺利运行&#xf…

IOS Siri和快捷指令打开app

使用场景 需要Siri打开应用或者在自定义快捷指令打开应用,并携带内容进入应用。 1.创建Intents文件 1.1 依次点开File->New->File 1.2 搜索intent关键字找到 SiriKit Intent Definition File文件 1.3 找到刚才创建的Intent文件,点击然后New Inte…

【JS逆向学习】快乐学堂登陆接口(自定义DES加密、ddddocr验证码识别)

逆向目标 网址:https://www.91118.com/Passport/Account/Login接口:https://www.91118.com/passport/Account/LoginPost参数: passr 逆向过程 输入手机号、密码、验证码 点击登陆,多试几次,然后观察并比较不通请求…

MMO 地图传送,UI系统框架设计

地图传送 创建传送点 建碰撞器触发 //位置归零 建一个传送门cube放到要传送的位置(这个teleporter1是传出的区域 这是从另一张地图传入时的传送门 创建一个脚本TeleporterObject给每个传送cube都绑上脚本 通过脚本,让传送门在编辑器下面还能绘制出来 …

GIT | git提交注释自动添加信息头

GIT | git提交注释自动添加信息头 时间:2024年9月6日10:20:11 文章目录 GIT | git提交注释自动添加信息头1.操作2.commit-msg文件 1.操作 2.commit-msg文件 #!/bin/sh # # An example hook script to check the commit log message. # Called by "git commit&q…

基于SpringBoot+Vue+MySQL的流浪猫狗宠物救助救援网站管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 在当今社会,随着宠物数量的激增及人们关爱动物意识的提升,流浪猫狗问题日益严峻。为解决这一问题,构建一套高效、便捷的流浪猫狗宠物救助救援网站管理系统显得尤为重要。本系统基于SpringBoot…

CSP-CCF★★★201812-2小明放学★★★

目录 一、问题描述 二、解答 (1)注意: (2)80分版: (3)100分版: 三、总结 一、问题描述 二、解答 (1)注意: 题目的n小于等于10的…

m3u8网页视频文件爬取与视频合成

文章目录 m3u8网页视频文件爬取与视频合成下载m3u8文件下载m3u8文件列表所对应的ts文件下载ffmpeg m3u8网页视频文件爬取与视频合成 我们经常在网络上找到的自己想要的视频素材却无法下载,并且打开控制台一看视频是通过分割成一份份的.ts文件发送过来的。 下载m3u8…

零信任安全:重新思考数字世界的访问

目录 ​编辑 网络安全形势的演变 数字安全的变化 引入零信任安全 零信任的当今意义 了解零信任原则 零信任架构的核心概念 实施微分段 持续验证:积极主动的立场 与传统安全模型的对比 在现代企业中实施零信任 零信任实施基础知识 多重身份验证 (MFA) 的…

c++(继承、模板进阶)

一、模板进阶 1、非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。 非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中…

非监督式机器学习:群集

聚类分析是一种非监督式机器学习形式,在此形式下,基于观察值的数据值或特征的相似性,将观察值分组到群集中。 这种就是非监督式机器学习,因为它不使用先前已知的标签值来训练模型。 在聚类分析模型中,标签是群集&#…