Opencv+Python笔记(七)边缘检测原理

news2024/9/24 13:16:51

注意:梯度计算总是由右边减去左边

目录

    • 一、边缘检测原理
    • 二、Sobel算子(基于搜索)
    • 三、Laplacian算子(基于零穿越)
      • 四、Candy边缘检测算法
        • 1.消除噪声
        • 2. 计算图像的亮度梯度值
        • 3.减除虚假边缘(非极大值抑制NMS)
        • 4. 双阈值筛选边界

一、边缘检测原理

边缘检测是图像处理和计算机视觉当中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点,用于确定图片中物体的边界(边缘)或者区域,边缘检测可以大幅减小数据量并且剔除不相关问题

边缘检测前,我们一般要先进行滤波对图像进行平滑处理。这是为了去除图片中的噪声。在边缘检测中,需要对像素亮度进行数值求导,结果会产生带有噪声的边缘。换而言之,图像中的相邻像素的亮度(特别是在边缘附近)波动比较大的噪音会被我们当成边界,但并不是我们寻找的主要边缘结构。

有许多方法用于边缘检测,他们的绝大部分可以划分为两类:基于搜索和基于零穿越

对图一的图片进行边缘检测 图二就是基于搜索 图三是基于领穿越
在这里插入图片描述

(1)基于搜索∶通过寻找图像一阶导数中的最大值来检测边界,然后利用计算结果估计边缘的局部方向,通常采用梯度的方向,并利用此方向找到局部梯度模的最大值。
(2)基于零穿越:通过寻找图像二阶导数零穿越来寻找边界。

二、Sobel算子(基于搜索)

本质是梯度运算

Sobel算子要同时计算图像x方向和y方向的卷积结果
在这里插入图片描述
结合x方向和y方向求出:
在这里插入图片描述
可以简化为:
在这里插入图片描述
具体卷积步骤:
对于一张5 * 6的图像,用Sobel算子卷积核来进行卷积:
在这里插入图片描述
深度学习中对于原图像中无法计算的边界像素点的计算:将原图像用0像素点扩展成一张7 * 8的图像:
在这里插入图片描述
具体例子:对于 (2, 1) 的像素点x轴的梯度计算:255 * -1 + 155 * 0 + 215 * 1 + 65 * -2 + 255 * 0 + 255 * 2 + 255 * -1 + 155 * 0 + 215 * 1 所得结果即 G x G_{x} Gx

Sobel特点:对效率要求较高 但是不太关注细纹理

Opencv API:

gray_x_or_y = cv.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)

输入:
1.src:传入的图像;
2.ddepth:图像的深度;
3.dx 和 dy: 分别代表所用的 Sobel 算子的 x 和 y 方向的偏导数。
4.dst:函数的输出结果存储在 dst 中
5.ksize:指Sobel算子的大小,即卷积核的大小,必须为奇数1、3、5、7,默认为3。注意:如果ksize = -1,就演变为3*3的Scharr算子。
6.scale:缩放导数的比例常数,默认情况为没有伸缩系数。
7.borderType:图像边界的模式,默认cv2.BORDER_DEFAULT。
输出:
Sobel_x, Sobel_y: 图像在x轴或y轴所得梯度计算结果

注意:
(1)由于梯度计算总是由右边减去左边 所以可能所得结果中存在负数以及大于255的数,而原图像为uint8数据类型(8位无符号数),Sobel建立的图像位数不够,所以要进行数据类型转换,处理完数据后再使用cv2.convertScaleAbs()函数将其转回原来的uint8格式,不然图像无法显示(cv2.convertScaleAbs()用于将图像数组进行线性变换并将结果转换为无符号8位整数类型。它通常用于图像对比度和亮度的调整。)
(2)Sobel算子求出来的是一个方向的梯度 最后还要用cv2.addWeighted()函数对所得x方向和y方向的结果相组合

gray_absX = cv2.convertScaleAbs(gray_x) #格式转换
gray_absY = cv2.convertScaleAbs(gray_y)
result_sobel = cv2.addWeighted(gray_absX, alpha, gray_absX, beta, C)  #图像融合

代码:

gray_x = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize = 3)
gray_y = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize = 3)
gray_absX = cv2.convertScaleAbs(gray_x)
gray_absY = cv2.convertScaleAbs(gray_y)
result_sobel = cv2.addWeighted(gray_absX, 0.5, gray_absX, 0.5, 0)

在这里插入图片描述

三、Laplacian算子(基于零穿越)

使用拉普拉斯算子边缘处理可以对图像进行锐化处理,突出图像亮度快速变化的区域,提高图像的视觉效果。但是对噪声敏感,适合用于无噪声图像,使用该算子进行边缘处理前先使用高斯滤波平滑掉噪声

拉普拉斯卷积核:
在这里插入图片描述
Opencv API:

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

输入:
src:输入的图像
ddepth:图像深度。-1表示采用与原图像相同的深度,目标图像的深度必须大于等于原图像的深度。
ksize:算子的大小,即卷积核的大小,必须为1,3,5,7,默认为3。
scale:缩放导数的比例常数,默认情况为没有伸缩系数。
borderType:图像边界的模式,默认cv2.BORDER_DEFAULT。

代码:

gray_la = cv2.Laplacian(gray, cv2.CV_64F)
result_laplacian = cv2.convertScaleAbs(gray_la)

在这里插入图片描述

四、Candy边缘检测算法

Canny边缘检测是当今最流行的也是目前公认最优的边缘检测算法。
该算法共分为四部分:
1. 消除噪声;
2. 计算图像的亮度梯度值;
3. 减除虚假边缘;
4. 双阈值筛选边界;

1.消除噪声

使用高斯滤波器可以去除大部分噪声,或者尽量减少不必要的图像细节产生不必要的边缘。 图像平滑处理

2. 计算图像的亮度梯度值

对高斯滤波平滑后的图像使用Sobel算子计算水平和竖直方向的一阶导数,从而求出边界的梯度和方向
梯度方向被分为四类:竖直、水平以及两对角线方向

3.减除虚假边缘(非极大值抑制NMS)

通过比较每个像素与周围像素在水平和垂直两个方向上的梯度值来实现剔除虚假边缘。如果一个像素对应的梯度在局部是最大的,也就是比他的上下左右像素梯度都大,它就保留下来。否则将就该像素置为0.

4. 双阈值筛选边界

在这里插入图片描述
通过双阈值筛选真正的边界 高于maxVal的边界称为边界 梯度值位于(minVal, maxVal)的边界称为若边界 进一步筛选 若与边界连通则处理为边界 否则舍弃

Opencv API:

dst = cv2.Canny(image, threshold1, threshold2)

输入:
image:输入的灰度图
threshold1:minVal,较小的阈值将间断的边缘连接起来。
threshold2:maxVal,较大的阈值检测图像中明显的边缘。
输出:
边缘处理后所得图像

代码:

result_candy = cv2.Canny(gray, 0, 160)

在这里插入图片描述

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

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

相关文章

OSCP-Sirol(docker容器到宿主机)

目录 扫描 WEB 提权 扫描 sudo nmap 192.168.64.54 -p- -sS -sVPORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.4p1 Debian 10+deb9u7 (protocol 2.0) 53/tcp closed domain 80/tcp open http Apache httpd 2.4.25 ((Debian)) 3306…

Spring更简单的存取方法

Spring存对象 在Spring的创建和使用篇章里,提到了用bean标签来将对象标识到Spring里面,但是这样的方法过于麻烦,下面我们来介绍使用类注解来存储对象。 五大类注解存对象 Spring里面有五大类注解: Controller、Service、Repos…

NeRF必读五:NeRF in the wild

前言 NeRF从2020年发展至今,仅仅三年时间,而Follow的工作已呈井喷之势,相信在不久的将来,NeRF会一举重塑三维重建这个业界,甚至重建我们的四维世界(开头先吹一波)。NeRF的发展时间虽短&#xf…

ubuntu 3060显卡驱动+cuda+cudnn+pytorch+pycharm+vscode

文章目录 运行环境:适用:思路:1.1 3060显卡驱动自动安装2.1 CUDA11.1.11)下载CUDA Toolkit 11.1 Update 1 Downloads2)contunue , 然后accept3)回车取消Driver安装,然后install4)添加环境变量5)确认是否安装成功 3.1 cudnn 8.1.11…

【git安装、使用、常用命令】

文章目录 一、git下载与安装二、git的使用1.初次运行配置git2、本地新建版本仓库3、提交代码 总结(git 常用命令) 一、git下载与安装 1、下载链接: Git(Git 主程序)https://git-scm.com/downloads 根据自身电脑操作系…

客户端请求耗时严重原因排查优化 (Nginx导致)

客户端请求耗时严重,初步从几个方面进行排查 1.检查网络连接,是否实现丢包,网络波动,网络拥堵等问题。 2.检查客户端请求耗时和project api 接口耗时差异,判断是nginx问题还是接口问题 如果是nginx耗时导致&#xff0c…

podman pull或者push http镜像遇到http: server gave HTTP response to HTTPS client

原因:Docker自从1.3.X之后docker registry交互默认使用的是HTTPS,但是搭建私有镜像默认使用的是HTTP服务,所以与私有镜像交时出现以上错误 解决方案: #增加以下配置 vi /etc/containers/registries.conf [[registry]] location "…

mac gitstats查看git提交记录

一、介绍: 进一步来讲,Gitstats它是一个git仓库分析软件,它可以检查仓库并生成历史数据的统计信息。可以帮助你查看git仓库的提交状态,根据不同维度分析计算,并自动生成数据图表。 官网介绍:http://gitst…

基于 DolphinDB 机器学习的出租车行程时间预测

DolphinDB 集高性能时序数据库与全面的分析功能为一体,可用于海量结构化数据的存储、查询、分析、实时计算等,在工业物联网场景中应用广泛。本文以纽约出租车行程时间预测为例,介绍如何使用 DolphinDB 训练机器学习模型,并进行实时…

python+vue古诗词鉴赏学习网站vue+django国学经典在线学习系统

国古典诗词,是中华传统文化的瑰宝,民族精神的精华,是中国传统文化的精粹,在中国璀灿的古代文化中占有重要的地位。古诗不仅内涵丰富、包罗万象、意境深邃,具有很高的审美价值和很强的艺术感染力,而且语言凝练、短小精悍,词句优美,韵体和谐,使…

大数据周会-本周学习内容总结011

开会时间:2023.04.23 15:00 线下会议 目录 01【spark】 02【es同步mysql】 03【下周任务】 01【spark】 尚硅谷大数据技术Spark教程-笔记01【Spark(概述、快速上手、运行环境、运行架构)】尚硅谷大数据技术Spark教程-笔记02【SparkCore&am…

vue2 路由相关知识点

文章目录 1. 搭建路由组件1.1 安装 vue-router1.2 配置路由 2. 使用路由3. 路由的跳转3.1 声明式导航3.2 编程式导航 4. 路由传参4.1 路由传递参数 : 字符串形式4.2 路由传递参数 : 对象写法4.3 路由传参相关面试题 5. meta 使用6. 重写 push 和 replace 方法 1. 搭建路由组件 …

6 计时器(六)

6.7 TMI编码器接口 Encoder Interface 编码器接口 编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度 每个高级定时器和通…

(二十一)查找算法-插值查找

1 基本介绍 1.1 插值查找 插值查找算法又称插值搜索算法,是在二分查找算法的基础上改进得到的一种查找算法。 插值查找算法只适用于有序序列,换句话说,它只能在升序序列或者降序序列中查找目标元素。作为“改进版”的二分查找算法&#xf…

手动测试台架搭建,让你的车载测试更轻松

目录:导读 引言 1、概述 2、主要内容 3、汽车测试台架分类 4、汽车测试台架分类 5、汽车测试台架分类台架测试输人台架硬件搭建CANoe台架搭建 6、台架测试输入? 7、需求规范是功能测试用例设计来源测试结果的判断﹔包括∶客户需求(功能规范)需求分…

Redis框架与SpringBoot的整合及详细学习汇总

目录 springBoot整合Redis Redis 的优势 Redis安装 Redis数据类型 springboot操作Redis springboot 配置redis RedisTemplate及其相关方法 springBoot实现上传下载 RedisTemplate及其相关方法 springBoot实现上传下载 springBoot CORS(跨域资源共享&#…

【C++11】简介、列表初始化、声明、范围for、STL中的一些变化

简介、列表初始化、声明、范围for、STL中的一些变化 文章目录 简介、列表初始化、声明、范围for、STL中的一些变化一、C11简介二、统一的列表初始化1.{ }初始化2.initializer_list容器 三、声明1.auto2.decltype3.nullptr 四、范围for循环五、STL中一些变化 一、C11简介 在2003…

虚拟数字人遇上ChatGPT,好看的皮囊和有趣的灵魂?

都说好看的皮囊千篇一律,有趣的灵魂万里挑一,博雅仔不禁好奇,到底有没有皮囊又好看,灵魂又有趣的人呢?二者能否得兼?答案是当然可以啊。 虽然在现实生活中,遇到这样的人需要静待缘分的安排&…

pg从磁盘读取文件

**瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台:Linux x86-64 Red Hat Enterprise Linux 7 版本:14 文档用途 了解存储管理器 详细信息 0. 相关数据类型 打开的每一个段用如下结构表示,pg中有MdfdVec数组并且记录了这个数组的…

微信小程序开发--利用和风天气API实现天气预报小程序

本来是参照《微信小程序开发实战》做一个天气预报小程序的,实际运行的时候提示错误,code 400,参数错误。说明问题应该出在查询API的语句上,没有返回结果。 查阅后才知道,可能书籍出版时间较早,现在的和风获…