【数字图像处理】边缘检测

news2024/11/16 10:25:51

文章目录

  • 0. 前言
  • 1. Sobel算子
  • 2. Canny算子
  • 3. 深度学习算法
    • 3.1 Holistically-Nested Edge Detection(HED)
    • 3.2 Richer Convolutional Features(RCF)

0. 前言

边缘检测是一种图像处理技术,旨在标识和定位数字图像中的边缘和轮廓。边缘是图像中灰度值变化明显的位置,通常是物体的边缘或表面的变化。通过边缘检测算法,可以将图像中的物体和背景分离出来,从而实现目标检测、图像分割、计算机视觉和机器人视觉等应用。

边缘检测算法的基本原理是在数字图像中寻找灰度变化的位置。其中,最常见的方法是基于图像梯度的边缘检测算法,如Sobel算子、Prewitt算子、Roberts算子和Canny算子等。

1. Sobel算子

Sobel算子将数字图像与两个卷积核Gx和Gy进行卷积,Gx和Gy分别用于计算水平方向和垂直方向上的梯度:
G x = [ − 1 0 1 − 2 0 2 − 1 0 1 ] G_x = \begin{bmatrix}-1 & 0 & 1 \\-2 & 0 & 2 \\-1 & 0 & 1\end{bmatrix} Gx= 121000121 G y = [ − 1 − 2 − 1 0 0 0 1 2 1 ] G_y = \begin{bmatrix}-1 & -2 & -1 \\0 & 0 & 0 \\1 & 2 & 1\end{bmatrix} Gy= 101202101
在计算完Gx和Gy之后,可以计算每个像素的梯度强度和方向:
G = G x 2 + G y 2 G = \sqrt{G_x^2 + G_y^2} G=Gx2+Gy2 θ = tan ⁡ − 1 ( G y G x ) \theta = \tan^{-1}\left(\frac{G_y}{G_x}\right) θ=tan1(GxGy)

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图片
img = cv2.imread("example.jpg", cv2.IMREAD_GRAYSCALE)

# 定义Sobel算子
sobel_x = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])
sobel_y = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]])

# 对图片进行Sobel边缘检测
img_sobel_x = cv2.filter2D(img, -1, sobel_x)
img_sobel_y = cv2.filter2D(img, -1, sobel_y)

# 计算梯度幅值和梯度方向
gradient_magnitude = np.sqrt(img_sobel_x ** 2 + img_sobel_y ** 2)
gradient_magnitude = (gradient_magnitude / gradient_magnitude.max())*255
gradient_direction = np.arctan2(img_sobel_y, img_sobel_x)
gradient_direction = (gradient_direction / gradient_direction.max()) * 255

# 显示结果
fig, axs = plt.subplots(1, 4, figsize=(16, 4))
axs[0].imshow(img, cmap="gray")
axs[0].set_title("Original")
axs[1].imshow(img_sobel_x, cmap="gray")
axs[1].set_title("Sobel X")
axs[2].imshow(img_sobel_y, cmap="gray")
axs[2].set_title("Sobel Y")
axs[3].imshow(gradient_magnitude.astype(np.uint8), cmap="gray")
axs[3].set_title("Gradient Magnitude")
plt.show()

在这里插入图片描述
可以看到,Gx主要检测出了竖直方向上的边缘,Gy主要检测出了水平方向上的边缘。

2. Canny算子

Canny算子是在工业界广泛使用的边缘检测算法,它的主要原理是通过检测图像中像素灰度变化的一阶导数来检测边缘。

Canny算法主要分为以下几个步骤:

  1. 去噪
    由于图像中可能存在噪声,并且噪声对边缘检测的影响较大(因为噪声也是高频信息),首先需要对图像进行去噪声处理。常见的方法是使用高斯滤波器对图像进行平滑处理,以减少噪声的影响。

  2. 计算梯度
    在图像平滑之后,需要计算每个像素点的梯度值和方向。常用的方法是使用Sobel算子,对图像进行水平和垂直方向上的梯度计算。梯度方向的计算可以通过计算水平和垂直梯度值的反正切来得到。

  3. 非极大值抑制
    由于Sobel算子计算的梯度值较大,图像中可能存在多个方向的梯度,需要进行非极大值抑制来确定每个像素点的主要梯度方向。具体来说,对于每个像素点,沿着其梯度方向上的两个邻域像素点进行比较,如果当前像素点的梯度值最大,则保留它,否则将其置为零。

  4. 双阈值检测
    经过前面的处理之后,图像中只剩下边缘可能存在的位置。但是,由于图像中存在很多噪声和灰度变化,有些边缘可能会被误判为非边缘。因此需要使用双阈值检测来进一步筛选边缘。将梯度幅值分为两个阈值:高阈值和低阈值。如果一个像素点的梯度幅值大于高阈值,则被认为是边缘像素;如果一个像素点的梯度幅值小于低阈值,则被认为是非边缘像素。如果一个像素点的梯度幅值在两个阈值之间,则只有它与高阈值相连的像素点才被认为是边缘像素。

  5. 边缘连接
    经过上述处理之后,图像中可能还存在一些不连续的边缘。因此,需要使用边缘连接算法将它们连接起来。一种常用的方法是使用基于滞后阈值的连接算法。具体来说,从高阈值像素开始,将与其相邻的低阈值像素加入到边缘中,直到不存在低阈。

3. 深度学习算法

3.1 Holistically-Nested Edge Detection(HED)

HED是一个端到端的边缘检测模型,总体架构如下:
在这里插入图片描述

3.2 Richer Convolutional Features(RCF)

RCF是针对HED的改进
在这里插入图片描述

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

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

相关文章

【信息系统安全/计算机系统安全】期末复习(HITWH)

PDF版本及更多资料(百度网盘): 链接:信息系统安全期末复习 目录 第一章 绪论 第二章 安全认证 填空题 第三章 访问控制 填空题 第四章 安全审计 填空题 第五章 Windows操作系统安全 填空题 第六章 Linux操作系统安全 填…

JDBCSpring:使用Spring JDBC封装Dao

目录标题 1、工程目录pom.xml文件 2、创建数据表student3、在resources目录创建配置文件applicationContext.xmljdbc.properties 4、创建Bean对象Student 5、创建Dao类UserDao接口 6、插入数据一、直接注入jdbctemplate二、继承jdbcdaosupport类 7、运行结果图 1、工程目录 pom…

go 使用pprof分析性能,trace追踪

前言 pprof是Go程序自带的性能分析工具,prof是profile(画像)的缩写,用于分析go程序的性能。 Profile Descriptions: allocs: A sampling of all past memory allocations 已分配内存采样 block: Stack traces that led to bloc…

梯度下降算法

梯度下降算法的公式: 公式依次代表为“下次迭代的点”、“目前所在的点”、“学习率”和“最大负向梯度”。按照这个公式,每次迭代都会根据上次的步长减去学习率乘以“梯度”的值,去一步一步更新,这样能可以每次迭代都朝着最大负方…

基于xml的Spring应用-1

基于xml的Spring应用 Spring的get方法 方法定义返回值和参数Object getBean (String beanName)根据beanName从容器中获取Bean实例,要求容器中Bean唯一返回值为Object,需要强转T getBean (Class type)根据Class类型从容器中获取Bean实例,要求…

SpringBoot 创建 WebService

开发环境: IDEA 2022.1.4 目录 1. 概述 2. 实现步骤 2.1 POM现加依赖 2.2 定义接口 IWebService 2.3 创建类 IWebServiceImpl 并实现接口 IWebService 2.4 配置类 CxfConfig 2.5 启动服务 2.6 测试 1. 概述 虽然webservice这块使用很少,但在局域网作服务还是相…

自动化测试之 selenium 的安装以及 selenium IDE 录制自动化脚本的用法

文章目录 1. 什么是自动化测试1)单元测试2)接口自动化3)UI 自动化 2. Selenium 介绍1)Selenium IDE2)Webdriver3)Selenium Grid 3. 如何使用 Selenium IDE 录制脚本4. 在 python 环境中安装 Selenium 框架 …

RSA--维纳攻击--代码和题目分析

文章目录 维纳攻击原理:维纳攻击脚本[羊城杯 2020]RRRRRRRSA 1题目描述:题目分析: 收获与体会: 维纳攻击原理: 两位大佬讲得非常清楚(搬运工就是我):https://zhuanlan.zhihu.com/p/…

代码随想录算法训练营第五十二天| 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

文章目录 300.最长递增子序列674. 最长连续递增序列718. 最长重复子数组 300.最长递增子序列 想清楚如何推导dp数组是关键 两层for循环,因为递增序列不是连续的 题目链接:代码随想录 解题思路: 1.dp[i]表示i之前包括i的以nums[i]结尾的最长递…

SpringBoot整合Mybatis-Plus实现浏览数据新增、Redis进行热度排名

在开发Web项目时,常用到的技术就是SpringBoot和Mybatis-Plus。本文将介绍如何使用SpringBoot整合Mybatis-Plus实现一个浏览数据新增功能,以及如何用Redis进行热度排名统计,最后用Vue进行数据渲染。 一、SpringBoot整合Mybatis-Plus 1. 新建…

0 基础 Java 自学之路(2023年最新版)

目录 一、语言的选择二、Java学习路线三、学习资料哪里找?1、Java经典书籍推荐2、Java经典视频推荐3、经典博客推荐 四、如何规划时间?五、是否要报培训班? 写了10多年的代码,之前做过某东的高级架构师,在技术这条路上…

BIOS主板(非UEFI)安装fedora36的方法

BIOS主板(非UEFI)安装fedora36的方法 现实困难:将Fedora-Workstation-Live-x86_64-38-1.6.iso写入U盘制作成可启动U盘启动fedora38安装时报错如下内容: Failed to find a suitable stage1 device: EFI System Partition cannot be of type ntfs: EFI Sys…

携创教育:自考、成考、开放大学几年能够毕业拿证?

目前,国家承认的成人学历提升的形式只有3种,分别是自考,成考,开放大学。 ▼各学历形式拿证时间▼ ★自学考试 自考没有入学考试,只需要参加相应的课程考试,所有课程考试合格后,符合毕业条件即可…

【论文简述】Cross-Attentional Flow Transformer for Robust Optical Flow(CVPR 2022)

一、论文简述 1. 第一作者:Xiuchao Sui、Shaohua Li 2. 发表年份:2021 3. 发表期刊:arxiv 4. 关键词:光流、Transformer、自注意力、交叉注意力、相关体 5. 探索动机:由于卷积的局部性和刚性权重,有限…

Flutter 中使用 Widgetbook 管理你的组件

Flutter 中使用 Widgetbook 管理你的组件 前言 Flutter 界面开发中我们有几个痛点 : 与设计师协作复用一套设计规范(figma) 可视化的管理你的组件代码(基础组件、业务组件) 不同设备尺寸测试你的组件 实时修改你的测试…

【事务】在spring中事务不生效的场景总结

在开发过程中会遇到事务失效的问题,所以在开发中要特别注意,下面我自己总结了事务不生效的场景,提醒自己。 一般出现问题分为几大类: 配置问题spring aop代理问题底层数据库不支持事务问题Transactional 配置错误开发过程中使用错…

Go有序map:orderedmap

有序映射 与传统的无序映射(Map)不同,orderedmap包中的有序映射(OrderedMap)可以记录键值对的插入顺序。orderedmap提供了一些有用的API,用来存储、删除、查询和遍历键值对。 获取OrderedMap 你可以通过Ord…

地面分割--Fast Segmentation of 3D Point Clouds for Ground Vehicles论文阅读与源码分析

文章目录 1写在前面的话2点云投影分块3地面点云分割4核心代码阅读投影分块直线拟合代码分割地面点云 5实验效果参考 1写在前面的话 这篇文章属于地面分割领域非常经典的一篇论文,论文具有速度快,在一定程度能适应有坡度的地形,文章主要分为两…

学习使用ansible自动化运维工具

目录 一、虚拟机环境 二、yum方式部署 三、ansible使用 (一)将ansible服务器上文件分发给各节点 1. 创建一个要复制的文件,并复制到Ansible管理主机上 2.编辑Ansible的playbook文件,将copy模块添加到任务列表中 3. 运行play…

【c++迭代器模拟实现】

目录: 前言一、STL初始二、六大组件之迭代器迭代器初始迭代器的模拟实现(1)victor正向迭代器反向迭代器1反向迭代器2反向迭代器3 (2)list正向迭代器反向迭代器 总结 前言 打怪升级:第52天 一、STL初始 什…