边缘检测运用

2024-09-05 05:12
文章标签 检测 边缘 运用

本文主要是介绍边缘检测运用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、简介
    • 1.边缘检测的概念
    • 2.边缘检测的目的
  • 二、代码实现
  • 三、边缘检测的方法
    • 1.1Canny边缘检测器
    • 1.2.Canny代码实现
    • 2.1Sobel边缘检测器
    • 2.2Sobel代码实现
    • 3.1Laplacian边缘检测器
    • 3.2Laplacian代码实现
    • 4.1Scharr边缘检测器
    • 4.2Scharr代码实现
  • 四、边缘检测的应用

一、简介

边缘检测是图像处理和计算机视觉中的一个基本问题,旨在标识数字图像中亮度变化明显的点,即检测图像中的边缘或不连续区域。这些边缘通常反映了图像中不同区域之间的边界或过渡区域,包含了物体的轮廓和结构信息。

1.边缘检测的概念

边缘检测是图像处理中的一个重要步骤,它通过检测图像中颜色、亮度或纹理的突然变化,提取出图像的边缘信息。这些边缘信息对于理解图像结构、提取重要特征以及进行目标识别、图像分割等后续处理至关重要。

2.边缘检测的目的

边缘检测的主要目的是捕捉图像中亮度急剧变化的区域,这些区域往往代表了图像中的重要信息,如物体的轮廓、纹理边界等。通过边缘检测,可以大幅度减少图像的数据量,并剔除不相关的信息,从而保留图像的重要结构属性。

二、代码实现

yuan = cv2.imread('yuan.png')
cv2.imshow('yuan',yuan)
cv2.waitKey(0)
# x方向上的边缘检测
yuan_x = cv2.Sobel(yuan,-1,dx=1,dy=0)
cv2.imshow('yuan_x',yuan_x)
cv2.waitKey(0)

x方向上的边缘检测:使用cv2.Sobel()函数进行x方向(水平方向)的边缘检测。-1表示输出图像与原图像相同的深度(但在这种情况下,如果原图像是8位无符号整数,输出可能会因为截断而丢失信息),dx=1和dy=0指定了x方向上的导数。显示x方向边缘检测的结果。

# x方向上的边缘,包括负数信息(右端),但显示不出来,因为范围是(0-255)
yuan_x_64 = cv2.Sobel(yuan,cv2.CV_64F,dx=1,dy=0)
cv2.imshow('yuan_x_64',yuan_x_64)
cv2.waitKey(0)

x方向边缘检测,保留负数信息:使用cv2.CV_64F作为输出图像的深度,这样可以保留边缘检测中的负数信息。

# x 方向的边缘,包括负数信息(右端),进行取绝对值操作,右端的负值信息可以显示
yuan_x_full = cv2.convertScaleAbs(yuan_x_64)
cv2.imshow('yuan_x_full',yuan_x_full)
cv2.waitKey(0)

取绝对值并显示x方向边缘:使用cv2.convertScaleAbs()函数将yuan_x_64中的所有值取绝对值,并转换为8位无符号整数以便显示。

# y方向上的边缘检测
yuan_y = cv2.Sobel(yuan,-1,dx=0,dy=1)
cv2.imshow('yuan_y',yuan_y)
cv2.waitKey(0)
# y方向上的边缘,包括负数信息(下端),但显示不出来,因为范围是(0-255)
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_64',yuan_y_64)
cv2.imshow('yuan_y_full',yuan_y_full)
cv2.waitKey(0)

y方向上的边缘检测:与x方向类似,但使用dy=1进行y方向(垂直方向)的边缘检测。

# x,y方向上的边缘检测
yuan_xy = cv2.Sobel(yuan,-1,dx=1,dy=1)
cv2.imshow('yuan_xy',yuan_xy)
cv2.waitKey(0)
# 使用图像加权运算组合x和y方向的2个边缘
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)

x,y方向上的边缘检测(结合):使用cv2.addWeighted()函数将x和y方向上的边缘检测结果进行加权组合。这里两个方向的权重都是1,意味着它们被等权重地组合在一起。

三、边缘检测的方法

边缘检测的方法多种多样,但大体上可以分为基于查找和基于零穿越的两类。基于查找的方法通过寻找图像一阶导数中的最大和最小值来检测边界,而基于零穿越的方法则通过寻找图像二阶导数零穿越来寻找边界。以下是一些常用的边缘检测算法:

1.1Canny边缘检测器

Canny算法是一种多级边缘检测算法,它首先使用高斯滤波器平滑图像以减少噪声,然后计算图像的梯度幅度和方向,接着通过非极大值抑制来细化边缘,并使用双阈值检测和边缘连接来最终确定边缘。Canny算法被认为是边缘检测的标准算法之一,因为它能够检测到良好的边缘并且错误率较低。

1.2.Canny代码实现

jijia = cv2.imread('2.png',cv2.IMREAD_GRAYSCALE)
cv2.imshow('jijia',jijia)
cv2.waitKey(0)
jijia_canny =  cv2.Canny(jijia,100,150)
cv2.imshow('jijia_canny',jijia_canny)
cv2.waitKey(0)

在这里插入图片描述

使用cv2.Canny()函数对灰度图像jijia进行边缘检测。Canny边缘检测是一种流行的边缘检测算法,它使用两个阈值(在这里是100和150)来检测图像中的强边缘和弱边缘,并通过连接这些边缘来形成连续的边界。
第一个阈值(100)是较低的阈值,用于检测边缘的初步候选。
第二个阈值(150)是较高的阈值,用于检测确定的边缘。
边缘检测算法会首先使用较低的阈值找到尽可能多的边缘,然后使用较高的阈值来找到其中的强边缘。最后,它会根据强边缘来连接弱边缘,从而生成最终的边缘图像。

2.1Sobel边缘检测器

Sobel算法使用两个3x3的卷积核(一个用于检测水平边缘,另一个用于检测垂直边缘)来估计图像的一阶导数。然后,通过计算这些导数的平方和的平方根来得到每个像素的边缘强度。Sobel算法对噪声有一定的平滑作用,但可能会检测到一些非边缘的像素点。

2.2Sobel代码实现

jijia = cv2.imread('2.png',cv2.IMREAD_GRAYSCALE)
jijia_x_64= cv2.Sobel(jijia,cv2.CV_64F,dx=1,dy=0)
jijia_x_full = cv2.convertScaleAbs(jijia_x_64)
jijia_y_64 = cv2.Sobel(jijia,cv2.CV_64F,dx=0,dy=1)
jijia_y_full = cv2.convertScaleAbs(jijia_y_64)
jijia_xy_sobel_full = cv2.addWeighted(jijia_x_full,1,jijia_y_full,1,0)
cv2.imshow('jijia_xy_sobel_full',jijia_xy_sobel_full)
cv2.waitKey(0)

在这里插入图片描述
使用Sobel算子在x、y方向上进行边缘检测 ,这里设置dx, dy表示检测该方向方向上的边缘。将边缘检测的结果转换为8位无符号整数图像。使用加权和将x方向和y方向上的边缘检测结果进行组合 ,显示组合后的边缘图像 。

3.1Laplacian边缘检测器

LoG算法首先使用高斯滤波器对图像进行平滑处理,然后计算图像的拉普拉斯算子(二阶导数)。由于拉普拉斯算子对边缘敏感,因此可以通过检测拉普拉斯算子的零交叉点来找到边缘。LoG算法能够检测到较细的边缘,并且对噪声有一定的抑制作用。

3.2Laplacian代码实现

jijia = cv2.imread('2.png',cv2.IMREAD_GRAYSCALE)
jijia_lap = cv2.Laplacian(jijia,cv2.CV_64F)
jijia_lap_full = cv2.convertScaleAbs(jijia_lap)
cv2.imshow('jijia_lap_full',jijia_lap_full)
cv2.waitKey(0)

在这里插入图片描述

使用Laplacian算子进行边缘检测,cv2.Laplacian 函数需要两个参数:源图像和输出图像的深度,这里设置输出图像的深度为cv2.CV_64F,即64位浮点数,将Laplacian算子的结果转换为8位无符号整数图像以便显示,显示转换后的边缘图像。

4.1Scharr边缘检测器

Scharr算子与Sobel算子类似,但它在计算梯度时使用了不同的系数。Scharr算子对于检测边缘更加敏感,因此在某些情况下可能会得到更清晰的边缘结果。

4.2Scharr代码实现

jijia = cv2.imread('2.png',cv2.IMREAD_GRAYSCALE)
jijia_x_64 = cv2.Scharr(jijia,cv2.CV_64F,dx=1,dy=0)
jijia_x_full = cv2.convertScaleAbs(jijia_x_64)
jijia_y_64 = cv2.Scharr(jijia,cv2.CV_64F,dx=0,dy=1)
jijia_y_full = cv2.convertScaleAbs(jijia_y_64)
jijia_xy_Scharr_full = cv2.addWeighted(jijia_y_full,1,jijia_y_full,1,0)
cv2.imshow('jijia_xy_Scharr_full',jijia_xy_Scharr_full)
cv2.waitKey(0)

在这里插入图片描述

使用Scharr算子在x,y方向上进行边缘检测,Scharr算子通常比Sobel算子提供更精确的边缘检测结果 。将边缘检测的结果转换为8位无符号整数图像以便显示,使用加权和将x方向和y方向上的边缘检测结果进行组合,显示组合后的边缘图像。

四、边缘检测的应用

边缘检测在图像处理、计算机视觉和机器视觉等领域具有广泛的应用。以下是一些典型的应用场景:

  • 目标检测与识别:通过边缘检测可以提取出图像中物体的轮廓和形状信息,从而实现目标的检测和识别。
  • 图像分割:边缘检测是图像分割的重要步骤之一,通过检测图像中的边缘可以将图像划分为不同的区域或对象。
  • 图像增强:边缘检测可以用于图像增强处理,通过突出图像中的边缘信息使图像更加清晰和易于理解。
  • 视频分析:在视频分析中,边缘检测可以用于目标的跟踪和运动分析等任务。

总之,边缘检测是图像处理和计算机视觉中的一个重要环节,它通过检测图像中的边缘信息为后续的图像处理和分析提供了重要的基础。随着技术的不断发展,边缘检测算法也在不断演进和完善以满足各种应用场景的需求。

这篇关于边缘检测运用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1138045

相关文章

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

poj 2431 poj 3253 优先队列的运用

poj 2431: 题意: 一条路起点为0, 终点为l。 卡车初始时在0点,并且有p升油,假设油箱无限大。 给n个加油站,每个加油站距离终点 l 距离为 x[i],可以加的油量为fuel[i]。 问最少加几次油可以到达终点,若不能到达,输出-1。 解析: 《挑战程序设计竞赛》: “在卡车开往终点的途中,只有在加油站才可以加油。但是,如果认为“在到达加油站i时,就获得了一

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

[数据集][目标检测]血细胞检测数据集VOC+YOLO格式2757张4类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2757 标注数量(xml文件个数):2757 标注数量(txt文件个数):2757 标注类别数:4 标注类别名称:["Platelets","RBC","WBC","sickle cell"] 每个类别标注的框数:

Temu官方宣导务必将所有的点位材料进行检测-RSL资质检测

关于饰品类产品合规问题宣导: 产品法规RSL要求 RSL测试是根据REACH法规及附录17的要求进行测试。REACH法规是欧洲一项重要的法规,其中包含许多对化学物质进行限制的规定和高度关注物质。 为了确保珠宝首饰的安全性,欧盟REACH法规规定,珠宝首饰上架各大电商平台前必须进行RSLReport(欧盟禁限用化学物质检测报告)资质认证,以确保产品不含对人体有害的化学物质。 RSL-铅,

YOLOv8/v10+DeepSORT多目标车辆跟踪(车辆检测/跟踪/车辆计数/测速/禁停区域/绘制进出线/绘制禁停区域/车道车辆统计)

01:YOLOv8 + DeepSort 车辆跟踪 该项目利用YOLOv8作为目标检测模型,DeepSort用于多目标跟踪。YOLOv8负责从视频帧中检测出车辆的位置,而DeepSort则负责关联这些检测结果,从而实现车辆的持续跟踪。这种组合使得系统能够在视频流中准确地识别并跟随特定车辆。 02:YOLOv8 + DeepSort 车辆跟踪 + 任意绘制进出线 在此基础上增加了用户

独立按键单击检测(延时消抖+定时器扫描)

目录 独立按键简介 按键抖动 模块接线 延时消抖 Key.h Key.c 定时器扫描按键代码 Key.h Key.c main.c 思考  MultiButton按键驱动 独立按键简介 ​ 轻触按键相当于一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通与断开。  ​ 按键抖动 由于按键内部使用的是机

基于stm32的河流检测系统-单片机毕业设计

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品