OpenCv(五)——边缘检测

目录

边缘检测

一、sobel算子边缘检测

(1)原理

1、X轴方向的边缘检测

2、Y轴方向的边缘检测        

(2)sobel算子参数

(3)X轴方向边缘检测代码演示

1、显示圆的图像

2、x方向上的边缘检测,即使用Gx卷积核

3、 转换数据类型保存图像的负数信息

4、x方向上的边缘,包括负数信息,进行取绝对值的操作,右端的负值信息就可以显示出来了,使用cv2.convertScaleAbs()方法

(4)Y轴方向边缘检测代码演示

1、y方向上的边缘检测,即使用Gy卷积核

2、 转换数据类型保存图像的负数信息,同时,y方向上的边缘,包括负数信息,进行取绝对值的操作,右端的负值信息就可以显示出来了,使用cv2.convertScaleAbs()方法

(5)同时对x,y方向做边缘检测(不建议使用)

(6)使用图像加权运算组合x和y方向的2个边缘。        

(7)读取人物图像观看sobel算子效果

二、Scharr 算子

(1)原理

三、拉普拉斯算子

(1)原理

2、参数及代码

四、canny边缘检测

(1)Canny边缘检测的优点

(2)canny边缘检测分为4个部分

1、图像降噪

2、梯度计算

3、非极大值抑制NMS(Non-Maximal Suppression)

4、双阈值边界跟踪

(3)参数解释及代码


边缘检测

边缘检测:是图形图像处理、计算机视觉和机器视觉中的一个基本工具,通常用于特征提取和特征检测,旨在检测一张数字图像中有明显变化的边缘或者不连续的区域。

一、sobel算子边缘检测

(1)原理

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

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

1、X轴方向的边缘检测

        Gx这个卷积核会从图像的左上角,从左到右从上到下移动,每移动到一个新的位置都会按卷积核计算。在纵向方向上进行加权计算。

        当卷积框出现在”1“这个位置时,卷积框左侧为黑色,数值为接近0的数;卷积框右侧为白色,数值为接近255的数,卷积计算之后的值大于255正值。

        当卷积框出现在”2“位置时,卷积框左右对称计算之后数值接近0,显示为黑色。

        当卷积框出现在”3“位置时,卷积框左侧为白色,数值为接近255的数;卷积框右侧为黑色,数值为接近0的数,卷积计算之后的值为小于255负值。

        由于负数在opencv的图像中显示不出来,所以会出现圆的左半部分会显示,右半部分显示不出来。

2、Y轴方向的边缘检测        

Gy这个卷积核会从图像的左上角,从左到右从上到下移动,每移动到一个新的位置都会按卷积核计算。在横向方向上进行加权计算。

        当卷积框出现在”1“这个位置时,卷积框上侧为黑色,数值为接近0的数;卷积框下侧为白色,数值为接近255的数,卷积计算之后的值大于255正值。

        当卷积框出现在”2“位置时,卷积框左右对称计算之后数值接近0,显示为黑色。

         当卷积框出现在”3“位置时,卷积框上侧为白色,数值为接近255的数;卷积框下侧为黑色,数值为接近0的数,卷积计算之后的值为小于255负值。

        由于负数在opencv的图像中显示不出来,所以会出现圆的上半部分会显示,下半部分显示不出来。

(2)sobel算子参数

cv2.Sobel(src, ddepth, dx, dy[, ksize[, scale[, delta[, borderType]]]])

参数:

src:输入图像

ddepth: 输出图像的深度(可以理解为数据类型),-1表示与原图像相同的深度

dx,dy:当组合为dx=1,dy=0时求x方向的一阶导数,当组合为dx=0,dy=1时求y方向的一阶导数(如果同时为1,通常效果不佳)

ksize:(可选参数)Sobel算子的大小,必须是1,3,5或者7,默认为3

(3)X轴方向边缘检测代码演示

目标:检测白色圆的边缘,得到一个完整的圆环。

1、显示圆的图像

yuan = cv2.imread('yuan.png')
cv2.imshow('yuan',yuan)
cv2.waitKey(0)

 

2、x方向上的边缘检测,即使用Gx卷积核

x方向上的边缘,包括负数信息(右端),但显示不出来,因为范围是(0~255)

yuan_x = cv2.Sobel(yuan,-1,dx=1,dy=0)
cv2.imshow('yuan_x',yuan_x)
cv2.waitKey(0)

 

3、 转换数据类型保存图像的负数信息

opencv读取图像默认是uint8类型,-1表示与原图像相同的深度即相同的数据类型也就是uint8类,型,使用cv2.CV_64F这个数据类型也就是float64位,将边缘检测的中遇到的负数保存下来,但是在图像中还没体现出来。

yuan_x_64 = cv2.Sobel(yuan,cv2.CV_64F,dx=1,dy=0)#默认uint8改为float64,可保存负数
cv2.imshow('yuan_x_64',yuan_x_64)
cv2.waitKey(0)

 

4、x方向上的边缘,包括负数信息,进行取绝对值的操作,右端的负值信息就可以显示出来了,使用cv2.convertScaleAbs()方法

yuan_x_full = cv2.convertScaleAbs(yuan_x_64)#转换为绝对值,负数转换为正数
cv2.imshow('yuan_x_full',yuan_x_full)
cv2.waitKey(0)

 

(4)Y轴方向边缘检测代码演示

1、y方向上的边缘检测,即使用Gy卷积核

yuan_y = cv2.Sobel(yuan,-1,dx=0,dy=1)
cv2.imshow('yuan_y',yuan_y)
cv2.waitKey(0)

 

y方向上的边缘,包括负数信息(下端),但显示不出来,因为范围是(0~255)

2、 转换数据类型保存图像的负数信息,同时,y方向上的边缘,包括负数信息,进行取绝对值的操作,右端的负值信息就可以显示出来了,使用cv2.convertScaleAbs()方法

yuan_y_64 = cv2.Sobel(yuan,cv2.CV_64F,dx=0,dy=1)#默认int8改为float64,可保存负数
yuan_y_full = cv2.convertScaleAbs(yuan_y_64)#转换为绝对值,负数转换为正数
cv2.imshow('yuan_y_full',yuan_y_full)
cv2.waitKey(0)

 

(5)同时对x,y方向做边缘检测(不建议使用)

yuan_xy = cv2.Sobel(yuan,-1,dx=1,dy=1)
cv2.imshow('yuan_xy',yuan_xy)
cv2.waitKey(100000)

 


(6)使用图像加权运算组合x和y方向的2个边缘。
        

从上面的图像看出只做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)

 


(7)读取人物图像观看sobel算子效果

zl = cv2.imread('zl.png',cv2.IMREAD_GRAYSCALE)#不用灰度试试效果
zl_x_64 = cv2.Sobel(zl,cv2.CV_64F,dx=1,dy=0)#默认int8改为float64,可保存负数
zl_x_full = cv2.convertScaleAbs(zl_x_64)#转换为绝对值,负数转换为正数
zl_y_64 = cv2.Sobel(zl,cv2.CV_64F,dx=0,dy=1)#默认int8改为float64,可保存负数
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_xy_sobel_full',zl_xy_sobel_full)
cv2.waitKey(0)


二、Scharr 算子

(1)原理

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

(2)参数及代码

cv.Scharr(src, ddepth, dx, dy[, dst[, scale[, delta[, borderType]]]])
src:输入图像
ddepth:输出图片的数据深度,由输入图像的深度进行选择
dx:x 轴方向导数的阶数
dy:y 轴方向导数的阶数

zl = cv2.imread('zl.png',cv2.IMREAD_GRAYSCALE)
zl_x_64 = cv2.Scharr(zl,cv2.CV_64F,dx=1,dy=0)#默认int8改为float64,可保存负数
zl_x_full = cv2.convertScaleAbs(zl_x_64)#转换为绝对值,负数转换为正数
zl_y_64 = cv2.Scharr(zl,cv2.CV_64F,dx=0,dy=1)#默认int8改为float64,可保存负数
zl_y_full = cv2.convertScaleAbs(zl_y_64)#转换为绝对值,负数转换为正数
zl_xy_Scharr_full = cv2.addWeighted(zl_x_full,1,zl_y_full,1,0)
cv2.imshow('zl_xy_Scharr_full',zl_xy_Scharr_full)
cv2.waitKey(0)


三、拉普拉斯算子

(1)原理

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

2、参数及代码

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

参数说明:

src:输入图像,可以是灰度图像,也可以是多通道的彩色图像

ddepth:输出图片的数据深度:

ksize:计算二阶导数滤波器的孔径大小,必须为正奇数,可选项

scale:缩放比例因子,可选项,默认值为 1

delta:输出图像的偏移量,可选项,默认值为 0

zl = cv2.imread('zl.png',cv2.IMREAD_GRAYSCALE)
zl_lap = cv2.Laplacian(zl,cv2.CV_64F)
zl_lap_full = cv2.convertScaleAbs(zl_lap)#转换为绝对值,负数转换为正数
cv2.imshow('zl_lap_full',zl_lap_full)
cv2.waitKey(0)

 


四、canny边缘检测

(1)Canny边缘检测的优点

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

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

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

(2)canny边缘检测分为4个部分

1、图像降噪

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

2、梯度计算

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

根据得到的这两幅梯度图(和)找到边界的梯度和方向。

3、非极大值抑制NMS(Non-Maximal Suppression)

        一阶微分在灰度值斜坡过渡时不为零且存在较粗的边缘,较粗的边缘会增大边缘检测的误差,因此需要细化边缘,一种较为常用的方法是非极大值抑制.

        非极大值抑制:即在梯度图像中寻找梯度方向上的最大值作为边缘,不是梯度方向上的最大值则抑制为0。因为梯度方向是灰度变化最大的方向。比较梯度图像中每一点的灰度值与梯度方向上至少两个梯度图像像素点灰度值的大小,根据上述大小关系来确定是否保留该点的灰度值。

4、双阈值边界跟踪

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

双阈值的基本处理步骤为:

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

        

若像素点所在的边缘存在强边缘像素,则保留,否则置0

(3)参数解释及代码

cv.Canny( image, threshold1, threshold2[, apertureSize[, L2gradient]])

image 为输入图像。

threshold1 表示处理过程中的第一个阈值。fL

threshold2 表示处理过程中的第二个阈值。fH

zl = cv2.imread('zl.png',cv2.IMREAD_GRAYSCALE)
cv2.imshow('zl',zl)
cv2.waitKey(0)
zl_canny = cv2.Canny(zl,100,150)#低,高
cv2.imshow('zl_canny',zl_canny)
cv2.waitKey(0)

 

总结:canny边缘检测的能力较强,使用简单,其他的边缘检测都是基于sobel算子的原理,都需要做处理。

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

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

相关文章

无人机数据链技术及运行方式详解!

一、无人机数据链技术要点 1. 通信传输技术 频段选择: 常用频段包括 L波段(1-2 GHz)、C波段(4-8 GHz)、Ku/K波段(12-40 GHz),不同频段在传输距离、带宽和抗干扰性间权衡。 低…

AI Agent 实战:搭建个人在线旅游助手

AI Agent 实战:搭建个人在线旅游助手 本次实验中,我们将继续探索 Agent 的提示词,学习更加规范的提示词撰写方法。 本实验中你将掌握的知识点 使用 Dify 构建 Agent 的方法结构化的提示词撰写技巧变量的使用方法 1. 准备 在新建 Agent 之…

检索增强生成(RAG):强化 AI 智能体的知识 “武装”

技术点目录 第一章、智能体(Agent)入门第二章、基于字节Coze 构建智能体(Agent)第三章、基于其他平台构建智能体(Agent)第四章、国内外智能体(Agent)经典案例详解第五章、大语言模型应用开发框架LangChain入门第六章、基于LangChain的大模型API接入第七章…

vscode 打开工程 看不到文件目录

vscode 打开工程 看不到文件目录 View->Explorer 快捷键:CtrlShiftE

厘米级定位赋能智造升级:品铂科技UWB技术驱动工厂全流程自动化与效能跃升”

在智能制造中的核心价值体现在‌高精度定位、流程优化、安全管理‌等多个维度,具体应用如下: 一、‌核心技术与定位能力‌ ‌厘米级高精度定位‌ UWB技术通过‌纳秒级窄脉冲信号‌(带宽超500MHz)实现高时间分辨率,结合…

getID3获取本地或远程视频时长

音频文件也可使用,使用ffmeg安装太复杂了 附ffmpeg方式:centos下安装ffmpeg_yum安装ffmpeg-CSDN博客 使用composer先安装 composer require james-heinrich/getid3 获取本地视频 //获取本地视频$video_path $_SERVER[DOCUMENT_ROOT].$params[video];…

10、Linux C 网络编程(完整版)

1、网络发展历史和分层 1.1 Internet 的历史 起源: 1957 年:苏联发射第一颗人造卫星 "Sputnik"。 1958 年:美国总统艾森豪威尔成立 DARPA(国防部高级研究计划署)。 1968 年:DARPA 提出 "…

前端:开源软件镜像站 / 清华大学开源软件镜像站 / 阿里云 / 网易 / 搜狐

一、理解开源软件镜像站 开源软件镜像是指开源软件在远程服务器上的备份副本,允许用户通过互联网快速下载和安装所需的软件。在国内,有多个知名的开源软件镜像站,为开发者提供稳定、快速的开源软件下载服务。 二、常见开源软件镜像站 序号…

Oracle 数据库中优化 INSERT INTO 操作的性能

在 Oracle 数据库中优化 INSERT INTO 操作的性能,尤其是在处理大批量数据时,可以通过以下方法显著提升效率。 使用直接路径插入(Direct-Path Insert) 通过 APPEND 提示绕过缓冲区缓存,直接写入数据文件,减…

嵌入式硬件篇---嘉立创PCB绘制

文章目录 前言一、PCB绘制简介1.1绘制步骤1.1.1前期准备1.1.2原理图设计1.1.3原理图转PCB1.1.4PCB布局1.1.5布线1.1.6布线优化和丝印1.1.7制版 1.2原理1.2.1电气连接原理1.2.2信号传输原理1.2.3电源和接地原理 1.3注意事项1.3.1元件封装1.3.2布局规则1.3.3过孔设计1.3.4DRC检查…

ideal自动生成类图的方法

在 IntelliJ IDEA 中,“**在项目资源管理器中选择以下类**” 是指通过 **项目资源管理器(Project Tool Window)** 找到并选中你需要生成类图的类文件(如 .java 文件),然后通过右键菜单或快捷键操作生成类图…

【零基础入门unity游戏开发——2D篇】2D物理关节 —— Joint2D相关组件

考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…

在Vue 3 + TypeScript + Vite 项目中安装和使用 SCSS

在Vue 3 TypeScript Vite 项目中安装和使用 SCSS 1、安装 SCSS 的相关依赖 npm install sass --save-dev2、配置 Vite 对于 Vue 3,Vite 已经内置了对 SCSS 的支持,通常不需要额外的配置。但是,如果需要自定义配置,可以在路径…

【渗透测试】Vulnhub靶机-FSoft Challenges VM: 1-详细通关教程

下载地址:https://www.vulnhub.com/entry/fsoft-challenges-vm-1,402/ 目录 前言 信息收集 目录扫描 wpscan扫描 修改密码 反弹shell 提权 思路总结 前言 开始前注意靶机简介,当第一次开机时会报apache错误,所以要等一分钟后重启才…

Redis 6.2.6 生产环境单机配置详解redis.conf

文章目录 Redis 生产环境配置详解配置文件示例基础网络与进程管理RDB 持久化配置复制(主从同步)设置内存管理AOF 持久化性能优化设置限制与监控其他参数完整配置总结 Redis 生产环境配置详解 在实际生产环境中,为了保障 Redis 的稳定性和高性…

SpringBoot实战:Excel文件上传、数据验证与存储全流程解析

一、需求场景与技术选型 在企业管理、数据中台等系统中,Excel文件处理是常见需求。本文将基于SpringBoot实现以下核心功能: 支持.xls/.xlsx文件上传数据完整性验证(非空、格式等)业务数据验证(关联数据库校验&#x…

使用Java爬虫按关键字搜索淘宝商品?

在电商领域,通过关键字搜索商品是获取商品信息的常见需求。Java爬虫技术可以帮助我们自动化地获取这些信息,提高工作效率。本文将详细介绍如何使用Java爬虫按关键字搜索淘宝商品,并提供完整的代码示例。 一、准备工作 1. 注册淘宝开放平台账…

【Git】5 个分区的切换方式及示例

目录 1. **工作区(Working Directory)**2. **缓存区(Stage/Index)**3. **本地仓库(Local Repository)**4. **远程仓库(Remote Repository)**5. **贮藏区(Stash&#xff0…

【计算机视觉】YOLO语义分割

一、语义分割简介 1. 定义 语义分割(Semantic Segmentation)是计算机视觉中的一项任务,其目标是对图像中的每一个像素赋予一个类别标签。与目标检测只给出目标的边界框不同,语义分割能够在像素级别上区分不同类别,从…

MATLAB之数据分析图系列:从二维到三维(直接套用)

MATLAB以其强大的矩阵运算和可视化功能,成为科研、工程领域的标配工具。本文提供从基础二维图形到复杂三维模型的即用代码块,涵盖数据标注、多图排版、动态演示等核心技巧 所有代码均经过MATLAB 2023a实测,替换数据即可生成专业级图表。” …